目前我正在处理一个非常复杂的页面,需要在用户选择页面上显示的配方时进行更新。在选择配方时,需要在配方上显示价格和配方名称。页。
我的想法是渲染多个扩展/包含模板,每个模板都负责自己的网页部分。但是,我遇到了一些问题:
问题:
到目前为止,我已经想到了这个系统:
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.朋友
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接受一个请求,将它(通过urls.py
中的url)传递给View,后者可以从请求中获取数据并呈现模板 - 其结果是template.html
页面中的HTML与您传递给渲染的上下文信息进行插值 - 作为对浏览器的响应,将HTML显示为页面。
模板渲染发生在服务器端 - 一旦它作为响应返回,Django模板就不再能够控制客户端显示的内容。 Django模板语言用于确定将呈现给Response的内容,但在模板呈现之后,它不再存在于页面上,不能用于修改显示在客户端的内容。为此你需要Javascript。
Javascript及其各种排列是人们用来为网页提供客户端交互性的内容在您的示例中,当用户选择配方时,Javascript事件会触发,并且可以将AJAX调用放回到您的服务器,这将获取该特定配方信息。
我建议做一些更高级的API阅读(一个很好的起点是Django Rest Framework,它有一个深入的教程)并进行API调用。并且可能会查看Single Page Apps (SPAs) and Django教程,因为这听起来像你想要实现的。
您可以使用多个“级联”模板!
使用所有需要的扩展制作第一个模板,就像你做的那样:
<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(或者哪一个)。
但是你还没有说明你想要在这些部分中放置什么样的内容。所以我的解决方案可能不合适。这只是我对菜单问题的解决方案 - 它是某种“多模板渲染”,通过扩展(或继承)解决。
尝试:from django.template import loader
并使用loader.render_to_string
然后只返回两个模板(填写上下文)作为json并解析前端的json