Django 主从视图插件
假设我有 3 个 django 应用程序,应用程序 Country、应用程序 Social 和应用程序 Financial。
Country 是一款“导航大师”应用程序。它在“索引”视图中列出了所有国家/地区,并在“详细信息”视图中显示每个国家/地区的详细信息。
每个国家/地区的详细信息包括其社交详细信息(来自社交应用程序)和财务详细信息(来自金融应用程序)。
社会和金融都有详细视图(针对每个国家/地区)
是否有一种优雅的方式将这些子详细信息视图“插入”到国家/地区提供的主详细信息视图中?因此,对于每个国家/地区详细信息页面,我会看到 2 个选项卡,显示该国家/地区的社会和财务详细信息。
Let's say I have 3 django apps, app Country, app Social and app Financial.
Country is a 'master navigation' app. It lists all the countries in a 'index' view and shows details for each country on its 'details' view.
Each country's details include their Social details (from the social app) and their Financial details (from the financial app).
Social and Financial both have a detail view (for each country)
Is there an elegant way to 'plug' in those sub-detail views into the master detail view provided by Countries? So for each country detail page I would see 2 tabs showing the social and the financial details for that country.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我针对此问题使用的 2 个常见解决方案:
部分模板:
创建一个用于渲染“社交”和“金融”的模板,除了它正在处理的对象之外,不需要视图中的内容(并使用对象函数或模板标签来渲染它)。
那么你可以轻松地 {% include %} 它(并首先设置所需的变量)。
此部分视图不会呈现完整的 HTML 页面,而只会呈现单个 DIV 或您希望使用的其他一些 HTML 元素。如果您还需要“仅限社交”页面,则可以创建一个呈现标题的页面,然后包含部分模板。您可以对部分模板使用 _template.html 等约定,对常规模板使用 template.html。
AJAX:
让您的“社交”和“财务”视图知道在 XMLHTTPRequest (request.is_ajax()) 中被调用。如果是,它们仅返回一个 DIV 元素,而不返回其周围的所有 HTML。这样您的母版页就可以在没有它的情况下呈现,并动态添加该内容。
AJAX 方式有几个优点:您不会在与整个页面相同的请求上渲染插件视图,因此,如果您有很多此类插件视图,则母版页将加载得更快,并且您可以让智能 JavaScript 仅选择要询问的相关插件视图。
此外,您还可以使用普通视图生成模板中所需的数据(在部分模板方法中实际上无法做到这一点)。
2 common solution I use for this problem:
Partial Templates:
Create a template for rendering "social" and "financial" that does not need stuff from the view, other than the object it is working on (and uses the objects functions or template tags to render it).
then you can easily {% include %} it (and set the needed variable first).
This partial view does not render a full HTML page, but only a single DIV or some other HTML element you wish to use. If you also need a "social-only" page, you can create a page that renders the header and then includes the partial template. You can use a convention like _template.html for the partial template, and template.html for the regular template.
AJAX:
Make your "social" and "financial" views aware of being called in XMLHTTPRequest (request.is_ajax()). If they are, they return only a DIV element, without all the HTML around it. This way your master page can render without it, and add that content on the fly.
The AJAX way has several advantages: you don't render the plugin views on the same request as the whole page, so if you have many of these plugin views, the master page will load faster, and you can have a smart javascript choose only the relevant plugin views to ask for.
Also, you can use the normal view to generate data you need in the template (which you can't really do in the Partial Templates method).