Django multiple template rendering
目前,我正在处理一个非常复杂的页面,当用户选择页面上显示的食谱时,该页面需要更新。选择食谱时,价格和食谱名称需要在页面上显示。
我的想法是渲染多个扩展/包含模板,它们各自负责网页的各自部分。但是,我遇到了一些问题:
问题:
到目前为止,我已经想到了这个系统:
base.html
1 2 3 4 5 6 7 8 9 10 | <body> {% block extend1 %} {% endblock %} {% block extend2 %} {% endblock %} {% block extend3 %} {% endblock %} </body> |
extend1.html(3个扩展的示例)
1 2 3 4 5 | {% extends base.html %} {% block extend1 %} #html code {% endblock |
views.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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接收请求,并将其(通过
模板渲染发生在服务器端-将其作为响应返回后,Django模板不再对客户端显示的内容具有任何控制权。 Django模板语言用于确定将向响应呈现的内容,但是在模板呈现之后,该页面不再存在,也无法用于修改客户端显示的内容。为此,您需要Javascript。
人们用来向网页提供客户端交互的Java脚本及其各种排列方式在您的示例中,当用户选择食谱时会触发Javascript事件,并可能向您的服务器发出AJAX调用这将获取特定的配方信息。
我建议对API进行一些更高级的阅读(一个很好的起点是Django Rest Framework,它具有深入的教程)并进行API调用。并可能考虑使用单页应用程序(SPA)和Django教程,因为这听起来像是您要实现的目标。
您可以使用多个"级联"模板!
使用所需的扩展名制作第一个模板,就像您所做的那样:
1 2 3 4 5 6 7 8 9 10 | <body> {% block extend1 %} {% endblock %} {% block extend2 %} {% endblock %} {% block extend3 %} {% endblock %} </body> |
然后制作第二个这样的模板:
1 2 3 4 5 6 7 8 9 10 | {% extends"template1.html" %} {% block extend1 %} Filling this with content..... {% endblock %} {% block extend2 %} {% endblock %} {% block extend3 %} {% endblock %} |
第三个:
1 2 3 4 5 6 7 | {% extends"template2.html" %} {% block extend2 %} filling another block with content..... {% endblock %} {% block extend3 %} {% endblock %} |
...等等。我用它来添加菜单!在某些页面上,我可能需要菜单,而在其他页面上,则不需要菜单-因此,根据我需要的页面类型(带或不带菜单),我最终扩展了版本1或版本2(或以前的版本)。
但是您尚未阐明要在这些部分中放置什么样的内容。所以我的解决方案可能不合适。这只是我菜单问题的解决方案-它是某种"多模板渲染",可以通过扩展(或继承)解决。
尝试:
并使用
然后只需将两个模板(已填写您的上下文)作为json返回
并在前端解析json