7

我想做的是在给定页面的底部包含一个来自单独模板的表单,比如说;“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 的情况下使用表单......?

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

谢谢。

4

2 回答 2

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",
)
.
.
于 2013-11-13T10:53:55.250 回答
2

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

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

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

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

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

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

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

于 2013-11-13T12:30:04.530 回答