Django多个模板渲染

时间:2017-12-06 09:56:19

标签: python django django-templates

目前我正在处理一个非常复杂的页面,当用户选择页面上显示的食谱时需要更新。需要选择食谱,价格和食谱名称需要显示在页面上。

我的想法是渲染多个扩展/包含模板,每个模板都负责他们自己的网页部分。但是,我遇到了一些问题:

  1. 我需要多个视图函数来处理所有模板的数据。
  2. 我需要将请求传递给多个视图函数,以便它们返回具有正确数据的模板
  3. 其中一个功能不仅接受请求,还接受模型对象的slug来更新页面上的数据。
  4. 问题:

    1. 如何将不同视图功能的响应/数据相互发送?
    2. 如何将请求传递给多个功能?
    3. extends的呈现是否也确保了base.html的呈现?
    4. 是否扩展正确使用或我应该使用包含?
    5. 到目前为止,我已经想到了这个系统:

      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))
      

3 个答案:

答案 0 :(得分:1)

你在误解Django模板语言的工作方式下工作 - 默认情况下,Django接受请求,将其(通过urls.py中的网址)转发给查看,可以获取请求中的数据,并呈现模板 - 其结果是使用上下文信息插入的template.html页面中的HTML你传递给渲染的 - 作为响应到浏览器,它将HTML显示为页面。

模板渲染发生在服务器端 - 一旦它作为响应返回,Django模板就不再能够控制客户端显示的内容。 Django模板语言用于确定将向响应呈现的内容,但在模板呈现之后,它不再存在于页面上,并且可以&#39;用于修改客户端显示的内容。为此你需要Javascript。

Javascript及其各种排列是人们用来为网页提供客户端交互的内容在您的示例中,当用户选择配方时,Javascript事件会触发,并且可以将AJAX调用发回给您服务器,它将获取特定的食谱信息。

我建议对API进行一些更高级的阅读(一个很好的起点是Django Rest Framework,它有一个深入的教程)并进行API调用。并且可能会查看Single Page Apps (SPAs) and Django教程,因为这听起来像是您尝试实现的目标。

答案 1 :(得分:1)

您可以使用多个“级联”模板!

使第一个模板具有所有需要的扩展,就像您做的一样:

<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(或以前的版本)。

但是您还没有弄清楚要放在那些部分中的内容是什么。所以我的解决方案可能不合适。这只是解决我菜单问题的方法-它是一种“多模板渲染”,通过扩展(或继承)解决。

答案 2 :(得分:-1)

尝试:from django.template import loader 并使用loader.render_to_string

然后只需将两个模板(已填写您的上下文)作为json返回 并在前端解析json