两个应用程序如何响应 Django 中的同一个 URL?

Posted

技术标签:

【中文标题】两个应用程序如何响应 Django 中的同一个 URL?【英文标题】:How can two apps respond to the same URL in Django? 【发布时间】:2012-02-22 02:22:39 【问题描述】:

我想我在这里遗漏了一个基本概念。在典型的 Django 项目中,您将有两个应用程序响应不同的 url:

http://localhost/myproj/app1/33
http://localhost/myproj/app2/newcomment.html

但是存在哪些机制来处理两个应用程序互补的情况 - 比如说一个提供内容,另一个提供演示?或者,一个是内容,另一个是一种静态的横向内容,应该出现在每个页面上。

特别是,我不明白这两个应用程序如何使用模板继承来扩展同一个模板。想象有一个带有模板“base.html”的基础应用程序“baseapp”:

...
<div blah blah>
% block content %
% endblock %
...

App1 扩展它:

% extends "baseapp/templates/base.html" %

% block content %
... here's the actual content...
% endblock %

App2 加个小横幅什么的:

% extends "baseapp/templates/base.html" %

% block content %
<div class="banner">Please support our site!</div>
 block.super 
% endblock %

那么这两个模板可以通过哪些方式显示?我能想到:

    app1 可以扩展 app2 的模板。但这似乎是错误的:app1 是内容提供者,不应该依赖于 app2 这样微不足道的东西。 app2 可以扩展 app1 的模板。但这似乎是错误的:现在 URL 方案必须通过 app2 汇集每个 URL(如果我理解正确的话) 中间件?

正如我所说,我可能遗漏了一些非常基本的东西。或者我做了一些我不知道的非常错误的假设。 (这个问题是我在Embed an optional Django application in another page, if that app is present 和How to capture and display information external to my webapp, but relevant to users of it? 之后的第三次尝试——我在界定问题时遇到了麻烦。)

【问题讨论】:

你的第二个应用是模板标签;这是您第一次尝试时的建议。 好的 - 我会仔细看看。 【参考方案1】:

应用程序不响应 URL,视图会。 View 是一个可以使用任何应用程序中的模型、表单和其他对象的功能。这里没有任何问题。

如果你想在模板中添加一些东西,继承不是唯一的方法。您最好使用自定义context processor 或自定义template tag。

【讨论】:

我刚来的帖子和你的第一句话一模一样:-) 好的,但是一个应用程序通常包含一个views.py,对吧?当你说“没有任何问题”时,我想我是在考虑诸如可维护性、互操作性和减少大多数不相关问题之间的依赖等问题。 @SteveBennett 您的特定问题是通过使用上下文处理器/模板标签来解决的。如果(通常)你想让你的应用程序保持松散耦合,只需创建另一个应用程序,它将在其视图中连接你的应用程序。不过,我在实践中从未遇到过这个问题。【参考方案2】:

我认为我在这里实际上缺少什么:

应用程序可以通过在正确的子目录中包含正确名称的模板来覆盖模板。 Django 文档并没有说得很清楚,我可以看到:他们在管理模板的上下文中引用了这个功能 如上覆盖模板时,您无法扩展它,但是: 这个 sn-p 让您既可以覆盖模板又可以扩展它:http://djangosnippets.org/snippets/1376/

这是一个密切相关的问题:Django: Overriding AND extending an app template

【讨论】:

以上是关于两个应用程序如何响应 Django 中的同一个 URL?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 django 中的两个不同表中返回数据?

django rest 更改 json 响应设计

Django如何监听启动,开启另外后台线程

如何从 Django 模板中的 API 响应转换日期

如何解决 .accepted_renderer 未在 Django 中的响应错误上设置

Django:如何在新模板中的另一个模型上使用 CreateView 的 form_valid() 返回的响应?