Django 多模板渲染
Posted
技术标签:
【中文标题】Django 多模板渲染【英文标题】:Django multiple template rendering 【发布时间】:2018-05-20 03:54:52 【问题描述】:目前我正在处理一个非常复杂的页面,当用户选择页面上显示的食谱时需要更新该页面。选择食谱后,价格和食谱名称需要显示在页面上。
我的想法是渲染多个扩展/包含模板,每个模板负责自己的网页部分。但是,我面临一些问题:
-
我需要多个视图函数来处理所有模板的数据。
我需要将请求传递给多个视图函数,以便它们返回包含正确数据的模板
其中一个函数不仅接受请求,还接受模型对象的 slug 来更新页面上的数据。
问题:
-
如何将来自不同视图函数的响应/数据相互发送?
如何将请求传递给多个函数?
extends 的呈现是否也确保 base.html 被呈现?
extends 是正确使用还是我应该使用 include?li>
到目前为止我已经想到了这个系统:
base.html
<body>
% block extend1 %
% endblock %
% block extend2 %
% endblock %
% block extend3 %
% endblock %
</body>
extend1.html(3 个扩展的示例)
% extends base.html %
% block extend1 %
#html code
% endblock
views.py
def extend1(request):
#do something
template = 'extend1.html'
context = a, b, c
return render(template.render(context))
def extend2(request):
#do something
template = 'extend2.html'
context = d, e, f
return render(template.render(context))
def extend3(request, slug):
#do something
template = 'extend3.html'
context = g, h, i
return render(template.render(context))
【问题讨论】:
很难说出您想要实现的目标-“需要根据用户输入更新的多个区域”您的意思是动态的吗?无需重新加载页面?多视图部分几乎肯定也是一种误解......您不需要调用多个视图来渲染一个模板 你显然不明白 Django 是如何工作的。如果你不从学习 django(使用官方教程和文档)开始,你只会浪费你自己的时间和每个人阅读你的问题并试图回答它们的时间。 【参考方案1】:您对 Django 模板语言的工作方式存在误解 - 默认情况下,Django 接受 Request,将其中继(通过您的 urls.py
中的 url)到 View ,它可以从请求中获取数据,并渲染一个 模板——其结果是来自您的 template.html
页面的 HTML,其中插入了您传递给渲染的上下文信息- 作为对浏览器的响应,将 HTML 显示为页面。
模板呈现发生在服务器端——一旦它作为响应返回,Django 模板就不再控制客户端显示的内容。 Django 模板语言用于确定将渲染到 Response 的内容,但是在 Template 渲染之后,它不再存在于页面上,不能用于修改客户端显示的内容。为此,您需要 javascript。
Javascript 和它的各种排列是人们用来为网页提供客户端交互性的方式那个特定的食谱信息。
我建议对 API 进行一些更高级的阅读(一个很好的起点是 Django Rest Framework,它有一个深入的教程)并进行 API 调用。并且可能查看Single Page Apps (SPAs) and Django 教程,因为这听起来像是您想要实现的目标。
【讨论】:
我不确定我是否会将 DRF 推荐给显然甚至没有花时间了解最基本的 Django 功能的人,即 HTTP 请求/响应的处理方式。 目的是为 OP 提供他所缺乏的上下文(“人们如何制作可以在客户端动态更新的网站?”)。我认为 DRF 中的教程以及在 Django 中使用 SPA 将大大有助于证明他的误解在哪里 彼得,感谢您抽出宝贵时间回答我的问题!事后看来,我意识到我并没有完全理解我正在使用的概念。你让我走上了正确的轨道,因为我之前已经设法让它工作了。我显然错误的想法是我需要让我的代码更漂亮或更干燥。这是我的一个误解,导致了这个公认的不太好的问题。不管怎么说,还是要谢谢你!我希望将来能带着更明智的问题来到 SO。【参考方案2】:您可以使用多个“级联”模板!
用所有需要的扩展制作第一个模板,就像你做的那样:
<body>
% block extend1 %
% endblock %
% block extend2 %
% endblock %
% block extend3 %
% endblock %
</body>
然后像这样制作第二个模板:
% extends "template1.html" %
% block extend1 %
Filling this with content.....
% endblock %
% block extend2 %
% endblock %
% block extend3 %
% endblock %
第三个:
% extends "template2.html" %
% block extend2 %
filling another block with content.....
% endblock %
% block extend3 %
% endblock %
...等等。我用它来添加菜单!在某些页面上,我可能需要菜单,而在其他页面上则不需要 - 因此,根据我需要的页面类型(有或没有菜单),我最终会扩展版本 1 或版本 2(或曾经的哪个)。
但是您还没有明确说明您想在这些部分中放置什么样的内容。所以我的解决方案可能不合适。这只是解决了我在菜单上遇到的问题 - 它是某种“多模板渲染”,通过扩展(或继承)解决。
【讨论】:
【参考方案3】:试试:from django.template import loader
并使用loader.render_to_string
然后将两个模板(填写您的上下文)作为 json 返回 并在前端解析json
【讨论】:
以上是关于Django 多模板渲染的主要内容,如果未能解决你的问题,请参考以下文章