通用编辑视图
本页介绍了以下视图,为编辑内容奠定了基础。
- django.views.generic.edit.FormView
- django.views.generic.edit.CreateView
- django.views.generic.edit.UpdateView
- django.views.generic.edit.DeleteView
参见
消息框架 中包含了 SuccessMessageMixin,它方便呈现关于成功提交表单的消息。
注解
本页的一些例子假定 Author
模型已在 myapp/models.py
中定义如下:
from django.db import models
from django.urls import reverse
class Author(models.Model):
name = models.CharField(max_length=200)
def get_absolute_url(self):
return reverse('author-detail', kwargs={'pk': self.pk})
FormView
class django.views.generic.edit.FormView
一个显示表单的视图。错误时,重新显示验证错误的表单;成功时,重定向到一个新的 URL。
祖先(MRO)
该视图从以下视图继承方法和属性。
- 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
示例 myapp/forms.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
示例 myapp/views.py:
from myapp.forms import ContactForm
from django.views.generic.edit import FormView
class ContactFormView(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().form_valid(form)
示例 myapp/contact.html:
<form method="post">{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Send message">
</form>
class django.views.generic.edit.BaseFormView
一个用于显示表单的基础视图。它不打算直接使用,而是作为 django.view.generic.edit.FormView
或其他显示表单的视图的父类。
祖先(MRO)
该视图从以下视图继承方法和属性。
CreateView
class django.views.generic.edit.CreateView
一个显示表单的视图,用于创建对象,重新显示带有验证错误(如果有)的表单并保存对象。
祖先(MRO)
该视图从以下视图继承方法和属性。
- 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
属性
template_name_suffix
对
GET
请求显示的CreateView
页面使用'_form'
的template_name_suffix
。例如,将这个属性改为'_create_form'
,为Author
模型创建对象的视图将导致默认的template_name
为'myapp/author_create_form.html'
。object
当使用
CreateView
时,你可以访问self.object
,也就是正在创建的对象。如果对象还没有被创建,其值将是None
。
示例 myapp/views.py:
from django.views.generic.edit import CreateView
from myapp.models import Author
class AuthorCreateView(CreateView):
model = Author
fields = ['name']
示例 myapp/author_form.html:
<form method="post">{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Save">
</form>
class django.views.generic.edit.BaseCreateView
一个用于创建新对象实例的基础视图。它不打算直接使用,而是作为 django.view.generic.edit.CreateView
的父类。
祖先(MRO)
该视图从以下视图继承方法和属性。
方法
get
(request, \args, **kwargs*)将当前对象实例(
self.object
)设置为None
。post
(request, \args, **kwargs*)将当前对象实例(
self.object
)设置为None
。
UpdateView
class django.views.generic.edit.UpdateView
显示用于编辑现有对象的表单视图,重新显示带有验证错误(如果有)的表单并保存对对象的更改。该视图使用从对象的模型类自动生成的表单(除非手动指定了表单类)。
祖先(MRO)
该视图从以下视图继承方法和属性。
- 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
属性
template_name_suffix
显示在
GET
请求中的UpdateView
页面使用'_form'
的template_name_suffix
。例如,将这个属性改为'_update_form'
,对于一个更新对象的视图,例如Author
模型,将导致默认的template_name
为``‘myapp/author_update_form.html’``。object
当使用
UpdateView
时,你可以访问self.object
,也就是被更新的对象。
示例 myapp/views.py:
from django.views.generic.edit import UpdateView
from myapp.models import Author
class AuthorUpdateView(UpdateView):
model = Author
fields = ['name']
template_name_suffix = '_update_form'
示例 myapp/author_update_form.html:
<form method="post">{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Update">
</form>
class django.views.generic.edit.BaseUpdateView
一个用于更新现有对象实例的基础视图。它不打算直接使用,而是作为 django.view.generic.edit.UpdateView
的父类
祖先(MRO)
该视图从以下视图继承方法和属性。
方法
get
(request, \args, **kwargs*)设置当前对象实例(
self.object
)。post
(request, \args, **kwargs*)设置当前对象实例(
self.object
)。
DeleteView
class django.views.generic.edit.DeleteView
显示确认页面并删除现有对象的视图。只有当请求方法是 POST
时,给定的对象才会被删除。如果这个视图是通过 GET
获取的,它将显示一个确认页面,该页面应该包含一个 POST 到同一 URL 的表单。
祖先(MRO)
该视图从以下视图继承方法和属性。
- django.views.generic.detail.SingleObjectTemplateResponseMixin
- django.views.generic.base.TemplateResponseMixin
- django.views.generic.edit.BaseDeleteView
- django.views.generic.edit.DeletionMixin
- django.views.generic.edit.FormMixin
- django.views.generic.base.ContextMixin
- django.views.generic.detail.BaseDetailView
- django.views.generic.detail.SingleObjectMixin
- django.views.generic.base.View
属性
form_class
New in Django 4.0.
Inherited from BaseDeleteView. The form class that will be used to confirm the request. By default django.forms.Form, resulting in an empty form that is always valid.
By providing your own
Form
subclass, you can add additional requirements, such as a confirmation checkbox, for example.template_name_suffix
对
GET
请求显示的DeleteView
页面使用'_confirm_delete'
的template_name_suffix
。例如,将这个属性改为'_check_delete'
,对于一个为Author
模型删除对象的视图,将导致默认的template_name
为'myapp/author_check_delete.html'
。
示例 myapp/views.py:
from django.urls import reverse_lazy
from django.views.generic.edit import DeleteView
from myapp.models import Author
class AuthorDeleteView(DeleteView):
model = Author
success_url = reverse_lazy('author-list')
示例 myapp/author_confirm_delete.html:
<form method="post">{% csrf_token %}
<p>Are you sure you want to delete "{{ object }}"?</p>
{{ form }}
<input type="submit" value="Confirm">
</form>
class django.views.generic.edit.BaseDeleteView
一个用于删除对象实例的基础视图。它不打算直接使用,而是作为 django.view.generic.edit.DeleteView
的父类。
祖先(MRO)
该视图从以下视图继承方法和属性。
- django.views.generic.edit.DeletionMixin
- django.views.generic.edit.FormMixin
- django.views.generic.detail.BaseDetailView
Changed in Django 4.0:
In older versions, BaseDeleteView
does not inherit from FormMixin
.