我想要做的是在给定页面底部的单独模板中包含一个表单,让我们说; “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的情况下使用该表单。?
所以我想更普遍的问题是;如何包含模板并为它们提供从视图生成的数据?
感谢。
答案 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响应。
您必须以这种或那种方式向上下文提供表单。可能的地方是:
在所有情况下,这只会在模板的上下文中插入表单 - 您仍需要在发布时处理表单处理。有不同的方法来解决这个问题,但从我猜你的用例(添加相同的表单和处理到你自己的应用程序的几个不同视图),使用自定义TemplateResponse子类来处理表单的初始化和处理可能只是是票。