【问题标题】:Include template displaying a form包括显示表单的模板
【发布时间】:2013-11-25 21:07:51
【问题描述】:

我想做的是在给定页面的底部包含一个来自单独模板的表单,比如说; “example.com/listdataandform/”。

当视图包含在 URLConf 中时,表单模板“form.html”将显示表单。所以我可以用“example.com/form/”查看

到目前为止,我所拥有的是这样的:

{% extends "base/base.html" %}

{% block title %} page title {% endblock %}
{% block content %}
<h2>some "scene" data</h2>
<ul>
{% for scene in scenes %}
    <li>{{ scene.scene }} - {{ scene.date }}</li>
{% endfor %}
</ul>

{% include "tasks/form.html"%}

{% endblock %}

“块内容”中的代码可以正常工作,因为它是用它的相应视图定义的,用于 url “example.com/listdataandform/”。

{% include "tasks/form.html"%}:这仅显示来自 form.html 的提交按钮,如预期的那样。我通过这样做才意识到:{% include "tasks/form.html"%},永远不会执行相应的视图方法来为“表单”模板提供数据。

有什么方法可以不用在 urls.py 中定义特定模式的视图,这样就可以使用表单而不用转到指定的 URL..?

所以我想更普遍的问题是;如何包含模板并为它们提供从视图生成的数据?

谢谢。

【问题讨论】:

    标签: django django-forms django-templates django-views


    【解决方案1】:

    我意识到只这样做:{% include "tasks/form.html"%},相应的视图方法永远不会执行来为“form”模板提供数据。

    确实如此。您包含了一个模板,它实际上意味着“包含” - 即:“在当前上下文中执行”。该模板对您的视图一无所知,甚至不知道“视图”是什么。

    这如何帮助我执行包含模板的视图以向其提供表单数据?

    它没有。 Django“视图”不是“模板的一部分”,它实际上是一个请求处理程序,它是一段接受 HTTP 请求并返回 HTTP 响应的代码。

    您必须以一种或另一种方式将表单提供给上下文。可能的地方是:

    • 在视图中
    • 在上下文处理器中(如果使用 RequestContext)
    • 如果使用 TemplateResponse 并且 TemplateResponse 尚未呈现,则在中间件中
    • 在自定义模板标签中

    在所有情况下,这只会将表单插入到模板的上下文中 - 您仍然需要在表单发布时处理表单。有不同的方法可以解决这个问题,但根据我对您的用例的猜测(将相同的表单和处理添加到您自己的应用程序的几个不同视图中),使用自定义 TemplateResponse 子类来处理表单的初始化和处理可能只是成为门票。

    【讨论】:

    • 您的回答和@hellsgate 的回答都有助于阐明请求和上下文在 Django 中的工作方式。我还发现包含的模板继承了初始化包含的模板的上下文,这很有用。只需要改变我的设计方法,它应该可以正常工作。谢谢!
    【解决方案2】:

    对于这种情况,我需要在每个(或几乎每个)页面上包含一些内容,我使用自定义上下文处理器,然后将其添加到 settings.py 中的 TEMPLATE_CONTEXT_PROCESSORS 中。您可以使用此方法将表单添加到上下文中。

    示例: common.py(与 settings.py 在同一个文件夹中)

    from myapp.forms import MyForm
    
    def context(request):
        c = {}
        c['myform'] = MyForm()
    
        return c
    

    您还可以在此处进行表单所需的任何处理。

    然后将其添加到您的 settings.py 文件中: 设置.py

    .
    .
    TEMPLATE_CONTEXT_PROCESSORS = (
        '''
        All the processors that are already there
        '''
        "myproject.common.context",
    )
    .
    .
    

    【讨论】:

    • 感谢您的回复。这如何帮助我执行包含模板的视图以向其提供表单数据?包含模板时应该如何使用?当通过 urls.py 中定义的 URL(例如 example.com/form)访问表单时,使用 render(request, 'form.html', {'form': form}) 可以正常工作。我可能无法完全掌握上下文概念,但我确信您的提示会解决问题 =) 问候
    • @sjiffa:通过将此方法添加到 TEMPLATE_CONTEXT_PROCESSORS 它然后成为默认/基本上下文的一部分,因此可用于所有模板,这意味着您根本不需要做任何其他事情来将它包含在任何地方。
    猜你喜欢
    • 2019-01-20
    • 1970-01-01
    • 2010-10-25
    • 1970-01-01
    • 2018-04-07
    • 2018-07-04
    • 2014-03-01
    • 2013-06-10
    • 1970-01-01
    相关资源
    最近更新 更多