我想要做的是在给定页面底部的单独模板中包含一个表单,让我们说; “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"%},从不执行相应的视图方法来为"form" -template提供数据 .
有没有办法解决这个问题,而无需在urls.py中定义特定模式的视图,这样可以在不进入指定URL的情况下使用该表单 .
所以我想更普遍的问题是;如何包含模板并为它们提供从视图生成的数据?
谢谢 .
2 回答
对于这样的场合,我需要在每个(或几乎每个)页面上包含一些内容,我使用自定义上下文处理器,然后将其添加到settings.py中的TEMPLATE_CONTEXT_PROCESSORS . 您可以使用此方法将表单添加到上下文中 .
示例:common.py(这与settings.py位于同一文件夹中)
您还可以在此处执行表单所需的任何处理 .
然后将其添加到settings.py文件中:settings.py
确实 . 你包含了一个模板,它实际上意味着“包含” - 即:“在当前上下文中执行” . 模板对您的观点一无所知,甚至不知道“视图”是什么 .
它没有 . Django“视图”不是“模板的一小部分”,它实际上是一个请求处理程序,它需要一段代码来接收HTTP请求并返回HTTP响应 .
您必须以这种或那种方式向上下文提供表单 . 可能的地方是:
在视图中
在上下文处理器中(如果使用RequestContext)
如果使用TemplateResponse并且尚未呈现TemplateResponse,则在中间件中
在自定义模板标记中
在所有情况下,这只会在模板的上下文中插入表单 - 您仍需要在发布时处理表单处理 . 有不同的方法来解决这个问题,但从我猜你的用例(添加相同的表单和处理到你自己的应用程序的几个不同视图),使用自定义TemplateResponse子类来处理表单的初始化和处理可能只是是票 .