首页 文章

包括显示表单的模板

提问于
浏览
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"%},从不执行相应的视图方法来为"form" -template提供数据 .

有没有办法解决这个问题,而无需在urls.py中定义特定模式的视图,这样可以在不进入指定URL的情况下使用该表单 .

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

谢谢 .

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",
    )
    .
    .
    
  • 2

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

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

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

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

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

    • 在视图中

    • 在上下文处理器中(如果使用RequestContext)
      如果使用TemplateResponse并且尚未呈现TemplateResponse,则在中间件中

    • 在自定义模板标记中

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

相关问题