通用编辑视图
表单的处理通常有3个步骤:
- 初始化的GET(空白或预填充的表单)
- 带有非法数据的POST(通常重新显示表单和错误信息)
- 带有合法数据的POST(处理数据并重定向)
Django提供一系列通用编辑视图用于表单的处理
注: 本页上的一些示例假设 Author 模型已在 myapp/models.py 中定义如下:(关于model会在后文中介绍)
from django.urls import reverse
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=200)
def get_absolute_url(self):
return reverse('author-detail', kwargs={'pk': self.pk})
FormView
引入
from django.views.generic.edit import FormView
介绍
显示表单的视图。出错时,重新显示带有验证错误的表单;成功时,重定向到新的URL。
祖先
此视图从以下祖先类集成方法和属性:
- django.views.generic.base.TemplateResponseMixin
- django.views.generic.edit.BaseFormView
- django.views.generic.edit.FormMixin
- django.views.generic.edit.ProcessFormView
- django.views.generic.base.View
示例
# form.py
from django import forms
class ContactForm(forms.Form):
name = forms.CharField()
message = forms.CharField(widget=forms.Textarea)
def send_email(self):
# send email using the self.cleaned_data dictionary
pass
# views.py
from myapp.forms import ContactForm
from django.views.generic.edit import FormView
class ContactView(FormView):
template_name = 'contact.html'
form_class = ContactForm
success_url = '/thanks/' #指定表单验证成功后的跳转
def form_valid(self, form):
# This method is called when valid form data has been POSTed.
# It should return an HttpResponse.
form.send_email()
return super(ContactView, self).form_valid(form)
<!-- contact.html -->
<form action="" method="post">{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Send message" />
</form>
CreateView
引入
from django.views.generic.edit import CreateView
介绍
显示用于创建对象的表单的视图,重新显示具有验证错误的表单(如果有)并保存对象。
祖先
此视图从以下祖先类集成方法和属性:
- django.views.generic.detail.SingleObjectTemplateResponseMixin
- django.views.generic.base.TemplateResponseMixin
- django.views.generic.edit.BaseCreateView
- django.views.generic.edit.ModelFormMixin
- django.views.generic.edit.FormMixin
- django.views.generic.detail.SingleObjectMixin
- django.views.generic.edit.ProcessFormView
- django.views.generic.base.View
注解
get_form_class()
按优先级定义返回表单类:- 如果给出
form_class
,则返回该表单类 - 如果未给出
form_class
,则是使用模型创建ModelForm
- 如果给出
按优先级选择模型类创建
ModelForm
(将表单与什么模型关联起来):- 如果给出
model
属性,则使用该模型类。 - 如果
get_object()
返回一个对象,则使用该对象的类。 - 如果给出
queryset
,则使用该查询集的模型。
- 如果给出
get_success_url()
选择表单验证成功后跳转的url:- 如果给出了
success_url
,则使用其定义的值; - 否则将使用模型对象的
get_absolute_url()
。
- 如果给出了
template_name_suffix
: 显示给 GET 请求的CreateView
页面使用'_form'
的template_name_suffix
。例如,对于创建示例 Author 模型的对象的视图将此属性更改为'_create_form'
将导致默认template_name
为'myapp/author_create_form.html'
。object
: 使用CreateView
时,您可以访问self.object
,这是正在创建的对象。如果对象尚未创建,则值将为 None。model
: 表单使用的模型类field
: model表单中要显示的字段。field
不可与form_class
通用
示例
# views.py
from django.views.generic.edit import CreateView
from myapp.models import Author
class AuthorCreate(CreateView):
model = Author
fields = ['name']
# urls.py
from django.urls import path
from myapp.views import AuthorCreate
urlpatterns = [
# ...
path('author/add/', AuthorCreate.as_view(), name='author_add'),
]
<!-- author_form.html -->
<form action="" method="post">{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Save" />
</form>
UpdateView
引入
from django.views.generic.edit import UpdateView
介绍
显示用于编辑现有对象的窗体的视图,重新显示具有验证错误的窗体(如果有)并保存对对象的更改。这使用从对象的模型类自动生成的表单(除非手动指定表单类)。
祖先
此视图从以下祖先类集成方法和属性:
- django.views.generic.detail.SingleObjectTemplateResponseMixin
- django.views.generic.base.TemplateResponseMixin
- django.views.generic.edit.BaseUpdateView
- django.views.generic.edit.ModelFormMixin
- django.views.generic.edit.FormMixin
- django.views.generic.detail.SingleObjectMixin
- django.views.generic.edit.ProcessFormView
- django.views.generic.base.View
注解
UpdateView的使用与Create的方法类似。CreateView是创建一个新的对象,而UpdateView是首先通过get_object()
获取到某个具体的对象,对该对象进行更新操作后保存。
示例
# views.py
from django.views.generic.edit import UpdateView
from myapp.models import Author
class AuthorUpdate(UpdateView):
model = Author
fields = ['name']
template_name_suffix = '_update_form'
#urls.py
from django.urls import path
from myapp.views import AuthorUpdate
urlpatterns = [
# ...
path('author/update/<int:pk>/', AuthorUpdate.as_view(), name='author_update'),
]
<!-- author_update_form.html -->
<form action="" method="post">{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Update" />
</form>
DeleteView
引入
from django.views.generic.edit import DeleteView
介绍
显示确认页面并删除现有对象的视图。仅当请求方法是 POST 时,才会删除给定对象。如果此视图通过 GET 提取,则会显示一个确认页面,其中应包含POST到同一网址的表单。
祖先
此视图从以下祖先类集成方法和属性:
- django.views.generic.detail.SingleObjectTemplateResponseMixin
- django.views.generic.base.TemplateResponseMixin
- django.views.generic.edit.BaseDeleteView
- django.views.generic.edit.DeletionMixin
- django.views.generic.detail.BaseDetailView
- django.views.generic.detail.SingleObjectMixin
- django.views.generic.base.View
示例
# views.py
from django.views.generic.edit import DeleteView
from django.urls import reverse_lazy
from myapp.models import Author
class AuthorDelete(DeleteView):
model = Author
success_url = reverse_lazy('author-list')
#urls.py
from django.urls import path
from myapp.views import AuthorDelete
urlpatterns = [
# ...
path('author/delete/<int:pk>/', AuthorDelete.as_view(), name='author_update'),
]
<form action="" method="post">{% csrf_token %}
<p>Are you sure you want to delete "{{ object }}"?</p>
<input type="submit" value="Confirm" />
</form>