[英]django default context variable
我是Django Web开发人员的新手,根据本教程设法建立了一个玩具项目。
但是,我发现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上进行了搜索,但一无所获。
“ form”是您需要从视图传递到模板的变量。
您应该创建一个forms.py文件来设置所有表单。
在此文件中,您将创建一个简单的表单,如下所示:
from django import forms
class NameForm(forms.Form):
your_name = forms.CharField(label='Your name', max_length=100)
然后在您看来,您应该导入表单,然后将“ form”变量设置为:
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
您使用的是基于类的通用视图,其中包含许多功能。查找它们的最佳来源是此视图。
如果以CreateView
为例(编辑-> CreateView),您会看到get()
方法(这是您仅使用GET来获取页面时调用的第一个方法render_to_response()
,只是调用了render_to_response()
并获取了上下文数据来自get_context_data()
。
在get_context_data()
内部,我们向上下文添加一个form
上下文变量,该变量分配给get_form()
。 等等...
与post()
方法相同,在post()
方法中,首先获取form
,检查其有效性,如果无效,则form_invalid()
方法在其上下文中呈现带有form
的模板。
您可以使用UpdateView
和DeleteView
进行相同UpdateView
,它们非常相似。 实际上,大多数表单处理代码都来自FormMixin
类。
创建自己的视图并继承Django的通用视图时,您会发现有时无法使用视图,但可以使用混合包(例如FormMixin
或ModelFormMixin
)。
因此,模板中的form
就是您在常规视图中指定的Author
模型的ModelForm
。 该视图正在使用modelform_factory
从模型中自动生成该表单,并使用fields指定了fields
。 由于已将其作为'form'
键添加到用于渲染模板的上下文中,因此您可以使用{{ form }}
访问它。 {{ form.as_table }}
将呈现在这种形式的HTML <table>
如所描述这里 。
如果您不喜欢表单的外观并想要自定义某些字段(并且不能仅通过更改模板来做到这一点),则需要创建自己的表单,并通过设置form_class
属性并删除fields
属性(字段将在您的表单中指定),如@drew在其响应中所述。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.