关于python:Django多重模板渲染

Django multiple template rendering

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

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

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

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

    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接收请求,并将其(通过urls.py中的url)中继到视图,该视图可以从请求中获取数据,并呈现模板(其结果是template.html页面中的HTML插入到传递给呈现的上下文信息中)作为对浏览器的响应,该模板将HTML显示为页面。

    模板渲染发生在服务器端-将其作为响应返回后,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(或以前的版本)。

    但是您尚未阐明要在这些部分中放置什么样的内容。所以我的解决方案可能不合适。这只是我菜单问题的解决方案-它是某种"多模板渲染",可以通过扩展(或继承)解决。


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

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