包括显示表单的模板

时间:2013-11-13 10:06:33

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

我想要做的是在给定页面底部的单独模板中包含一个表单,让我们说; “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的情况下使用该表单。?

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

感谢。

2 个答案:

答案 0 :(得分:3)

对于这样的场合,我需要在每个(或几乎每个)页面上包含一些内容,我使用自定义上下文处理器,然后将其添加到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文件中: settings.py

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

答案 1 :(得分:2)

  

我只知道这样做:{%include“tasks / form.html”%},从不执行相应的视图方法来提供带有数据的“表单”模板。

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

  

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

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

您必须以这种或那种方式向上下文提供表单。可能的地方是:

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

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