---
title: "通用编辑视图"
version: 5.2
locale: zh-hans
source: https://docs.djangoproject.com/zh-hans/5.2/ref/class-based-views/generic-editing/
canonical: https://djangodocs.dev/zh-hans/5.2/ref/class-based-views/generic-editing/
---
# 通用编辑视图

本页介绍了以下视图，为编辑内容奠定了基础。

- [`django.views.generic.edit.FormView`](#django.views.generic.edit.FormView)
- [`django.views.generic.edit.CreateView`](#django.views.generic.edit.CreateView)
- [`django.views.generic.edit.UpdateView`](#django.views.generic.edit.UpdateView)
- [`django.views.generic.edit.DeleteView`](#django.views.generic.edit.DeleteView)

> **See also**
>
> [消息框架](/zh-hans/5.2/ref/contrib/messages/) 中包含了 [`SuccessMessageMixin`](/zh-hans/5.2/ref/contrib/messages/#django.contrib.messages.views.SuccessMessageMixin)，它方便呈现关于成功提交表单的消息。

> **Note**
>
> 本页的一些例子假定 `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`](/zh-hans/5.2/ref/class-based-views/mixins-simple/#django.views.generic.base.TemplateResponseMixin)
- [`django.views.generic.edit.BaseFormView`](#django.views.generic.edit.BaseFormView)
- [`django.views.generic.edit.FormMixin`](/zh-hans/5.2/ref/class-based-views/mixins-editing/#django.views.generic.edit.FormMixin)
- [`django.views.generic.edit.ProcessFormView`](/zh-hans/5.2/ref/class-based-views/mixins-editing/#django.views.generic.edit.ProcessFormView)
- [`django.views.generic.base.View`](/zh-hans/5.2/ref/class-based-views/base/#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**：

```html+django
<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）**

该视图从以下视图继承方法和属性。

- [`django.views.generic.edit.FormMixin`](/zh-hans/5.2/ref/class-based-views/mixins-editing/#django.views.generic.edit.FormMixin)
- [`django.views.generic.edit.ProcessFormView`](/zh-hans/5.2/ref/class-based-views/mixins-editing/#django.views.generic.edit.ProcessFormView)

## `CreateView`

#### `class django.views.generic.edit.CreateView`

一个显示表单的视图，用于创建对象，重新显示带有验证错误（如果有）的表单并保存对象。

**祖先（MRO）**

该视图从以下视图继承方法和属性。

- [`django.views.generic.detail.SingleObjectTemplateResponseMixin`](/zh-hans/5.2/ref/class-based-views/mixins-single-object/#django.views.generic.detail.SingleObjectTemplateResponseMixin)
- [`django.views.generic.base.TemplateResponseMixin`](/zh-hans/5.2/ref/class-based-views/mixins-simple/#django.views.generic.base.TemplateResponseMixin)
- [`django.views.generic.edit.BaseCreateView`](#django.views.generic.edit.BaseCreateView)
- [`django.views.generic.edit.ModelFormMixin`](/zh-hans/5.2/ref/class-based-views/mixins-editing/#django.views.generic.edit.ModelFormMixin)
- [`django.views.generic.edit.FormMixin`](/zh-hans/5.2/ref/class-based-views/mixins-editing/#django.views.generic.edit.FormMixin)
- [`django.views.generic.detail.SingleObjectMixin`](/zh-hans/5.2/ref/class-based-views/mixins-single-object/#django.views.generic.detail.SingleObjectMixin)
- [`django.views.generic.edit.ProcessFormView`](/zh-hans/5.2/ref/class-based-views/mixins-editing/#django.views.generic.edit.ProcessFormView)
- [`django.views.generic.base.View`](/zh-hans/5.2/ref/class-based-views/base/#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**：

```html+django
<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）**

该视图从以下视图继承方法和属性。

- [`django.views.generic.edit.ModelFormMixin`](/zh-hans/5.2/ref/class-based-views/mixins-editing/#django.views.generic.edit.ModelFormMixin)
- [`django.views.generic.edit.ProcessFormView`](/zh-hans/5.2/ref/class-based-views/mixins-editing/#django.views.generic.edit.ProcessFormView)

**方法**

#### `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`](/zh-hans/5.2/ref/class-based-views/mixins-single-object/#django.views.generic.detail.SingleObjectTemplateResponseMixin)
- [`django.views.generic.base.TemplateResponseMixin`](/zh-hans/5.2/ref/class-based-views/mixins-simple/#django.views.generic.base.TemplateResponseMixin)
- [`django.views.generic.edit.BaseUpdateView`](#django.views.generic.edit.BaseUpdateView)
- [`django.views.generic.edit.ModelFormMixin`](/zh-hans/5.2/ref/class-based-views/mixins-editing/#django.views.generic.edit.ModelFormMixin)
- [`django.views.generic.edit.FormMixin`](/zh-hans/5.2/ref/class-based-views/mixins-editing/#django.views.generic.edit.FormMixin)
- [`django.views.generic.detail.SingleObjectMixin`](/zh-hans/5.2/ref/class-based-views/mixins-single-object/#django.views.generic.detail.SingleObjectMixin)
- [`django.views.generic.edit.ProcessFormView`](/zh-hans/5.2/ref/class-based-views/mixins-editing/#django.views.generic.edit.ProcessFormView)
- [`django.views.generic.base.View`](/zh-hans/5.2/ref/class-based-views/base/#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**：

```html+django
<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）**

该视图从以下视图继承方法和属性。

- [`django.views.generic.edit.ModelFormMixin`](/zh-hans/5.2/ref/class-based-views/mixins-editing/#django.views.generic.edit.ModelFormMixin)
- [`django.views.generic.edit.ProcessFormView`](/zh-hans/5.2/ref/class-based-views/mixins-editing/#django.views.generic.edit.ProcessFormView)

**方法**

#### `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`](/zh-hans/5.2/ref/class-based-views/mixins-single-object/#django.views.generic.detail.SingleObjectTemplateResponseMixin)
- [`django.views.generic.base.TemplateResponseMixin`](/zh-hans/5.2/ref/class-based-views/mixins-simple/#django.views.generic.base.TemplateResponseMixin)
- [`django.views.generic.edit.BaseDeleteView`](#django.views.generic.edit.BaseDeleteView)
- [`django.views.generic.edit.DeletionMixin`](/zh-hans/5.2/ref/class-based-views/mixins-editing/#django.views.generic.edit.DeletionMixin)
- [`django.views.generic.edit.FormMixin`](/zh-hans/5.2/ref/class-based-views/mixins-editing/#django.views.generic.edit.FormMixin)
- [`django.views.generic.base.ContextMixin`](/zh-hans/5.2/ref/class-based-views/mixins-simple/#django.views.generic.base.ContextMixin)
- [`django.views.generic.detail.BaseDetailView`](/zh-hans/5.2/ref/class-based-views/generic-display/#django.views.generic.detail.BaseDetailView)
- [`django.views.generic.detail.SingleObjectMixin`](/zh-hans/5.2/ref/class-based-views/mixins-single-object/#django.views.generic.detail.SingleObjectMixin)
- [`django.views.generic.base.View`](/zh-hans/5.2/ref/class-based-views/base/#django.views.generic.base.View)

**属性**

#### `form_class`

从 `BaseDeleteView` 继承而来。将用于确认请求的表单类。默认 [`django.forms.Form`](/zh-hans/5.2/ref/forms/api/#django.forms.Form)，结果是一个空的表单，总是有效的。

通过提供你自己的 `Form` 子类，你可以添加额外的要求，比如说，确认复选框。

#### `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**：

```html+django
<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`](/zh-hans/5.2/ref/class-based-views/mixins-editing/#django.views.generic.edit.DeletionMixin)
- [`django.views.generic.edit.FormMixin`](/zh-hans/5.2/ref/class-based-views/mixins-editing/#django.views.generic.edit.FormMixin)
- [`django.views.generic.detail.BaseDetailView`](/zh-hans/5.2/ref/class-based-views/generic-display/#django.views.generic.detail.BaseDetailView)
