【问题标题】:django default context variabledjango 默认上下文变量
【发布时间】:2019-07-28 09:36:15
【问题描述】:

我是 Django web dev 的新手,设法在this tutorial 之后设置了一个玩具项目。

但是我发现 Django 官方文档以及本教程非常混乱,我很难理解,尤其是 模板上下文变量

例如在xxapp/views.py中我们定义了如下几个视图,

from django.views.generic.edit import CreateView, UpdateView, DeleteView
from django.urls import reverse_lazy

from catalog.models import Author

class AuthorCreate(CreateView):
    model = Author
    fields = '__all__'
    initial = {'date_of_death': '05/01/2018'}

class AuthorUpdate(UpdateView):
    model = Author
    fields = ['first_name', 'last_name', 'date_of_birth', 'date_of_death']

class AuthorDelete(DeleteView):
    model = Author
    success_url = reverse_lazy('authors')

然后在模板中,我们有这个

{% extends "base_generic.html" %}

{% block content %}
  <form action="" method="post">
    {% csrf_token %}
    <table>
    {{ form.as_table }} <!-- WHERE IS THIS "FORM" FROM? -->
    </table>
    <input type="submit" value="Submit">
  </form>
{% endblock %}

我了解这个模板文件,除了一件事,form.as_table 来自哪里,它是什么??

我知道,如果我们使用一些内置的类视图或模型,我们可能会有一些免费的上下文数据,但是我在哪里查找它们,我在 Django 上搜索但一无所获。

【问题讨论】:

    标签: python django django-templates


    【解决方案1】:

    您正在使用基于类的通用视图,其中包含许多功能。查找它们的最佳来源是this one

    如果您以CreateView 为例(Edit -> CreateView),您会看到get() 方法,这是您使用GET 获取页面时调用的第一个方法,它只调用@987654325 @ 带有从 get_context_data() 获取的上下文数据。

    get_context_data() 内部,我们将form 上下文变量添加到上下文中,该变量分配给get_form()。等等……

    post() 方法相同,首先获取form,检查其有效性,如果无效,form_invalid() 方法会在其上下文中呈现带有form 的模板。

    UpdateViewDeleteView 也可以这样,它们非常相似。大多数表单处理代码实际上来自FormMixin 类。

    在创建自己的视图、继承 Django 的通用视图时,您会发现有时您不能使用视图,但可以使用 mixins(例如 FormMixinModelFormMixin)。

    因此,您模板中的form 是您在通用视图中指定的Author 模型的ModelForm。该视图使用modelform_factory 从模型中自动生成该表单,其中包含您使用fields 指定的字段。由于它作为'form' 键添加到用于呈现模板的上下文中,因此您可以使用{{ form }} 访问它。 {{ form.as_table }} 将在 &lt;table&gt; 中呈现此表单的 HTML,如 here 所述。

    如果您不喜欢表单的外观并希望自定义某些字段(仅通过更改模板无法做到这一点),您需要创建自己的表单,并告诉您对它的看法通过设置form_class 属性并删除fields 属性(字段将在您的表单中指定),如@drew 在他的回复中所述。

    【讨论】:

      【解决方案2】:

      “form”是您需要从视图传递到模板的变量。

      您应该创建一个 forms.py 文件来设置您的所有表单。

      在此文件中,您将创建一个简单的表单,如下所示:

      from django import forms
      
      class NameForm(forms.Form):
          your_name = forms.CharField(label='Your name', max_length=100)
      

      然后在您看来,您应该导入表单,然后将“表单”变量设置为:

      form = NameForm()
      

      或者,如果您已发布数据:

      form = NameForm(request.POST)
      

      因此,一旦您将此变量传递给模板,您就可以像使用“form.as_table”一样调用整个表单

      或者您可以调用单个表单字段,例如:

      {{ form.your_name.label }}
      {{ form.your_name }}
      {{ form.your_name.errors }}
      

      有关更多信息,请参阅 Django 站点上的此帮助文档:https://docs.djangoproject.com/en/2.1/topics/forms/#the-form-class

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-08-15
        • 1970-01-01
        • 2017-01-24
        • 2019-03-23
        • 2016-04-07
        • 1970-01-01
        • 2011-08-27
        相关资源
        最近更新 更多