===================== Generic editing views ===================== The following views are described on this page and provide a foundation for editing content: * :class:`django.views.generic.edit.FormView` * :class:`django.views.generic.edit.CreateView` * :class:`django.views.generic.edit.UpdateView` * :class:`django.views.generic.edit.DeleteView` .. seealso:: The :doc:`messages framework ` contains :class:`~django.contrib.messages.views.SuccessMessageMixin`, which facilitates presenting messages about successful form submissions. .. note:: Some of the examples on this page assume that an ``Author`` model has been defined as follows in ``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 A view that displays a form. On error, redisplays the form with validation errors; on success, redirects to a new URL. **Ancestors (MRO)** This view inherits methods and attributes from the following views: * :class:`django.views.generic.base.TemplateResponseMixin` * ``django.views.generic.edit.BaseFormView`` * :class:`django.views.generic.edit.FormMixin` * :class:`django.views.generic.edit.ProcessFormView` * :class:`django.views.generic.base.View` **Example 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 **Example myapp/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().form_valid(form) **Example myapp/contact.html**: .. code-block:: html+django
{% csrf_token %} {{ form.as_p }}
``CreateView`` ============== .. class:: django.views.generic.edit.CreateView A view that displays a form for creating an object, redisplaying the form with validation errors (if there are any) and saving the object. **Ancestors (MRO)** This view inherits methods and attributes from the following views: * :class:`django.views.generic.detail.SingleObjectTemplateResponseMixin` * :class:`django.views.generic.base.TemplateResponseMixin` * ``django.views.generic.edit.BaseCreateView`` * :class:`django.views.generic.edit.ModelFormMixin` * :class:`django.views.generic.edit.FormMixin` * :class:`django.views.generic.detail.SingleObjectMixin` * :class:`django.views.generic.edit.ProcessFormView` * :class:`django.views.generic.base.View` **Attributes** .. attribute:: template_name_suffix The ``CreateView`` page displayed to a ``GET`` request uses a ``template_name_suffix`` of ``'_form'``. For example, changing this attribute to ``'_create_form'`` for a view creating objects for the example ``Author`` model would cause the default ``template_name`` to be ``'myapp/author_create_form.html'``. .. attribute:: object When using ``CreateView`` you have access to ``self.object``, which is the object being created. If the object hasn't been created yet, the value will be ``None``. **Example myapp/views.py**:: from django.views.generic.edit import CreateView from myapp.models import Author class AuthorCreate(CreateView): model = Author fields = ['name'] **Example myapp/author_form.html**: .. code-block:: html+django
{% csrf_token %} {{ form.as_p }}
``UpdateView`` ============== .. class:: django.views.generic.edit.UpdateView A view that displays a form for editing an existing object, redisplaying the form with validation errors (if there are any) and saving changes to the object. This uses a form automatically generated from the object's model class (unless a form class is manually specified). **Ancestors (MRO)** This view inherits methods and attributes from the following views: * :class:`django.views.generic.detail.SingleObjectTemplateResponseMixin` * :class:`django.views.generic.base.TemplateResponseMixin` * ``django.views.generic.edit.BaseUpdateView`` * :class:`django.views.generic.edit.ModelFormMixin` * :class:`django.views.generic.edit.FormMixin` * :class:`django.views.generic.detail.SingleObjectMixin` * :class:`django.views.generic.edit.ProcessFormView` * :class:`django.views.generic.base.View` **Attributes** .. attribute:: template_name_suffix The ``UpdateView`` page displayed to a ``GET`` request uses a ``template_name_suffix`` of ``'_form'``. For example, changing this attribute to ``'_update_form'`` for a view updating objects for the example ``Author`` model would cause the default ``template_name`` to be ``'myapp/author_update_form.html'``. .. attribute:: object When using ``UpdateView`` you have access to ``self.object``, which is the object being updated. **Example myapp/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' **Example myapp/author_update_form.html**: .. code-block:: html+django
{% csrf_token %} {{ form.as_p }}
``DeleteView`` ============== .. class:: django.views.generic.edit.DeleteView A view that displays a confirmation page and deletes an existing object. The given object will only be deleted if the request method is ``POST``. If this view is fetched via ``GET``, it will display a confirmation page that should contain a form that POSTs to the same URL. **Ancestors (MRO)** This view inherits methods and attributes from the following views: * :class:`django.views.generic.detail.SingleObjectTemplateResponseMixin` * :class:`django.views.generic.base.TemplateResponseMixin` * ``django.views.generic.edit.BaseDeleteView`` * :class:`django.views.generic.edit.DeletionMixin` * ``django.views.generic.detail.BaseDetailView`` * :class:`django.views.generic.detail.SingleObjectMixin` * :class:`django.views.generic.base.View` **Attributes** .. attribute:: template_name_suffix The ``DeleteView`` page displayed to a ``GET`` request uses a ``template_name_suffix`` of ``'_confirm_delete'``. For example, changing this attribute to ``'_check_delete'`` for a view deleting objects for the example ``Author`` model would cause the default ``template_name`` to be ``'myapp/author_check_delete.html'``. **Example myapp/views.py**:: from django.urls import reverse_lazy from django.views.generic.edit import DeleteView from myapp.models import Author class AuthorDelete(DeleteView): model = Author success_url = reverse_lazy('author-list') **Example myapp/author_confirm_delete.html**: .. code-block:: html+django
{% csrf_token %}

Are you sure you want to delete "{{ object }}"?