Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django多模板渲染_Python_Django_Django Templates - Fatal编程技术网

Python Django多模板渲染

Python Django多模板渲染,python,django,django-templates,Python,Django,Django Templates,目前,我正在处理一个非常复杂的页面,当用户选择页面上显示的配方时,需要更新该页面。选择配方后,需要在页面上显示配方的价格和名称 我的想法是呈现多个extend/include模板,每个模板负责自己的网页部分。但是,我面临一些问题: 我需要多个视图函数来处理所有模板的数据 我需要将请求传递给多个视图函数,以便它们返回包含正确数据的模板 其中一个函数不仅接受请求,还接受模型对象的slug来更新页面上的数据 问题: 如何从不同的视图函数相互发送响应/数据 如何将请求传递给多个函数 extends的呈现

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

我的想法是呈现多个extend/include模板,每个模板负责自己的网页部分。但是,我面临一些问题:

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

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

    base.html

    <body>
        {% block extend1 %}
        {% endblock %}
    
        {% block extend2 %}
        {% endblock %}
    
        {% block extend3 %}
        {% endblock %}
    </body>
    
    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))
    

    您误解了Django模板语言的工作原理-默认情况下,Django接受一个请求,将其转发(通过
    url.py
    中的URL)到视图,该视图可以从请求中获取数据,并呈现一个模板,其结果是
    Template.HTML
    页面中的HTML,其中插入了传递给呈现的上下文信息,作为对浏览器的响应,浏览器将HTML显示为页面

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

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


    我建议对API进行一些更高级的阅读(Django Rest Framework是一个很好的起点,它有一个深入的教程)并进行API调用。还可以看看教程,因为这听起来像是你想要达到的目的。

    试试:
    来自django.template import loader
    并使用
    loader.render_to_string

    然后,只需将这两个模板(填入上下文)作为json返回即可
    并在前端解析json

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

    使用所需的所有扩展创建第一个模板,就像您所做的那样:

    <body>
    {% block extend1 %}
    {% endblock %}
    
    {% block extend2 %}
    {% endblock %}
    
    {% block extend3 %}
    {% endblock %}
    </body>
    
    第三个:

    {% extends "template2.html" %}
    {% block extend2 %}
    filling another block with content.....
    {% endblock %}
    
    {% block extend3 %}
    {% endblock %}
    
    ……等等。我用它来添加菜单!在某些页面上,我可能需要菜单,而在其他页面上则不需要。因此,根据我需要的页面类型(带菜单或不带菜单),我最终扩展了版本1或版本2(或曾经扩展过的版本)


    但是你还没有明确你想把什么样的内容放进这些部分。所以我的解决方案可能不合适。这只是解决我在菜单上遇到的问题的方法——它是一种“多模板渲染”,通过扩展(或继承)来解决。

    很难说你想要实现什么-“需要根据用户输入更新的多个区域”是指动态的吗?不重新加载页面?多视图部分几乎肯定也是一种误解。。。您不需要调用多个视图来呈现一个模板,您显然不了解Django是如何工作的。如果你不从学习django开始(使用官方教程和文档),你只会浪费你自己的时间和每个人阅读你的问题并试图回答他们的时间。我不确定我会推荐DRF给那些显然没有花时间理解最基本django功能的人,这就是HTTP请求/响应的处理方式。其目的是向OP提供他所缺少的上下文(“人们如何创建可以在客户端动态更新的网站?”)。我认为DRF和Django使用SPA的教程将大大有助于证明他的误解在哪里Peter,感谢您抽出时间回答我的问题!事后看来,我意识到我没有完全理解我所使用的概念。不过,你让我走上了正确的轨道,因为我之前已经设法让它工作了。我的想法显然是错误的,那就是我需要让我的代码更漂亮或更枯燥。这是我的一个误解,导致了这个不太好的问题。无论如何谢谢你!我希望将来能提出更多有根据的问题。
    {% 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 %}