【问题标题】:Reusing django re-usable apps重用 django 可重用应用程序
【发布时间】:2010-11-17 06:12:21
【问题描述】:

我想知道这是否可以实现(作为应用程序/中间件):

我安装了 django-registration 应用程序。然后,我创建了基于站点的应用程序来制作一些通用页面视图。我想在首页上放置一个登录表单和一个注册表单。所以我进入并修改 /register/login.html 和 register/register.html 模板以适应我的首页设计(html 内容)。然后我转到我的主页 index.html 文件,然后转到我希望这些块(登录和注册)去的 html 中的位置,然后添加 {% load "register/login.html" %} 和一个{% 加载“注册/注册.html”%}。现在,当 urlconf 调用我的索引视图时,模板将到达 LOAD 触发器并调用 LOGIN 视图,以便将其所有 form.elements 传递给它,并且也为其元素调用 REGISTER 视图。然后,那些完成(渲染)的视图被传递到我的 index.html 并插入到我放置 LOAD 语句的位置。

目前可以做到以上几点吗?我的目标是使用各种可用的应用程序并将它们插入到我的项目中,而无需触及它们的任何代码(我想确保以后可以升级各个应用程序并且不会破坏我的项目中的任何东西,因为我添加了自定义的东西......) .

如果上述情况目前可行,有人可以提供一些文档/教程/操作指南,以了解重用他人应用程序的最佳实践吗?

【问题讨论】:

  • Django 根本不擅长可重用性,主要通过分叉和维护其源代码的单独分支来定制 3rd 方应用程序。我最好建议你看看金字塔网络框架如何处理应用程序可扩展性docs.pylonshq.com/pyramid/dev/narr/extending.html
  • @andreypopp 这是一个非常有趣的观点。但是,您是否考虑过首先抱怨那些 3rd 方应用程序而不是 Django?

标签: python django model-view-controller web-applications


【解决方案1】:

当然有{% include %} 标签,它允许您将模板直接包含在另一个模板中。它还获取随附模板获取的所有内容,因此,如果您使用 RequestContext,这意味着它可以访问请求变量中的所有内容。

但是,您似乎是在说您想以某种方式实际调用注册视图和登录视图并将结果嵌入到您的页面中。理论上,这可以通过编写一个自定义标签来实现,该标签使用 http GET 调用 URL,然后从请求中输出生成的 HTML。

我不会推荐这个。相反,对于首页,继续创建两个指向 django-registration 应用程序中相应 URL 的表单。

【讨论】:

    【解决方案2】:

    如何简单地修改我正在重用的应用程序中的视图以包含一个额外的参数来查看它是否被用作 SUBVIEW(因此不返回 render_to_response() ),并检查“FORMNAME”在request.POST 数据。然后,如果 SUBVIEW(我正在重新使用的应用程序的视图)在 request.POST 中找到它的“FORMNAME”,它将处理该表单。如果没有提供 request.POST 数据,它将返回一个包含所有表单元素的字典,而不是 render_to_response()。然后,我可以在我的首页视图中调用该函数,并将返回的值字典与任何其他组件一起传递给我的模板。提交时,将调用该函数,如果它在 request.POST 数据中找到“表单名称”(此“表单名称”可以在隐藏字段中,它将处理该表单,否则将返回表单元素的字典,在我看来下一个函数将被调用,这可能与 django.contrib.django-registration.register() 视图有关。这将产生 ULTIMATE RE-USABILITY!

    这样我也可以访问 form.errors!!

    我的看法:

    def index(request):
       login = django.contrib.register.login(request, ... , Subview=True)
       register = django.contrib.register.register(request, ... , Subview=True)
    
       return render_to_response('index.html', {'login_form': login, 'register_form': register})
    

    或者,我可以分叉每个应用程序并对其进行修改...这违背了将应用程序作为独立维护的包重新使用的目的,而更像是复杂的代码粘贴。

    【讨论】:

      猜你喜欢
      • 2010-12-05
      • 1970-01-01
      • 2011-08-22
      • 2015-03-22
      • 2014-12-18
      • 1970-01-01
      • 2010-10-08
      • 2012-03-14
      • 2012-03-31
      相关资源
      最近更新 更多