目前我正在处理一个非常复杂的页面,需要在用户选择页面上显示的配方时进行更新 . 在选择配方时,需要在配方上显示价格和配方名称 . 页 .
我的想法是渲染多个扩展/包含模板,每个模板都负责自己的网页部分 . 但是,我遇到了一些问题:
-
我需要多个视图函数来处理所有模板的数据 .
-
我需要将请求传递给多个视图函数,以便它们返回具有正确数据的模板
-
其中一个函数不仅接受请求,还接受模型对象的slug来更新页面上的数据 .
问题:
-
如何从不同的视图功能发送响应/数据?
-
如何将请求传递给多个函数?
-
extends的渲染是否也确保base.html被渲染?
-
扩展正确的东西使用或我应该使用包括?
到目前为止,我已经想到了这个系统:
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))
2 回答
你是在误解Django模板语言的工作方式下工作 - 默认情况下Django需要 Request ,将它(通过你的
urls.py
中的url)传递给 View ,它可以从请求中获取数据,然后呈现 Template - 其结果是template.html
页面中的HTML使用您传递给渲染的上下文信息进行插值 - 作为 Response 到浏览器,它将HTML显示为页面 .模板渲染发生在服务器端 - 一旦它作为 Response 返回,Django模板就不再能够控制客户端显示的内容 . Django模板语言用于确定将呈现给 Response 的内容,但在 Template 呈现之后,它不会被用于修改显示在客户端的内容 . 为此你需要Javascript .
Javascript和它的各种排列是人们用来为网页提供客户端交互性的东西在你的例子中,当用户选择一个配方时会触发一个Javascript事件,并且可以将一个AJAX调用放回到你的服务器,这将获取该特定的配方信息 .
我建议做一些更高级的API阅读(一个很好的起点是Django Rest Framework,它有一个深入的教程)并进行API调用 . 并且可能会查看Single Page Apps (SPAs) and Django教程,因为这听起来像你想要实现的 .
尝试:
from django.template import loader
并使用loader.render_to_string
然后只返回两个模板(填写上下文)作为json并解析前端的json