generic-editing.txt 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. =====================
  2. Generic editing views
  3. =====================
  4. The following views are described on this page and provide a foundation for
  5. editing content:
  6. * :class:`django.views.generic.edit.FormView`
  7. * :class:`django.views.generic.edit.CreateView`
  8. * :class:`django.views.generic.edit.UpdateView`
  9. * :class:`django.views.generic.edit.DeleteView`
  10. .. seealso::
  11. The :doc:`messages framework </ref/contrib/messages>` contains
  12. :class:`~django.contrib.messages.views.SuccessMessageMixin`, which
  13. facilitates presenting messages about successful form submissions.
  14. .. note::
  15. Some of the examples on this page assume that an ``Author`` model has been
  16. defined as follows in ``myapp/models.py``::
  17. from django.db import models
  18. from django.urls import reverse
  19. class Author(models.Model):
  20. name = models.CharField(max_length=200)
  21. def get_absolute_url(self):
  22. return reverse('author-detail', kwargs={'pk': self.pk})
  23. ``FormView``
  24. ============
  25. .. class:: django.views.generic.edit.FormView
  26. A view that displays a form. On error, redisplays the form with validation
  27. errors; on success, redirects to a new URL.
  28. **Ancestors (MRO)**
  29. This view inherits methods and attributes from the following views:
  30. * :class:`django.views.generic.base.TemplateResponseMixin`
  31. * ``django.views.generic.edit.BaseFormView``
  32. * :class:`django.views.generic.edit.FormMixin`
  33. * :class:`django.views.generic.edit.ProcessFormView`
  34. * :class:`django.views.generic.base.View`
  35. **Example myapp/forms.py**::
  36. from django import forms
  37. class ContactForm(forms.Form):
  38. name = forms.CharField()
  39. message = forms.CharField(widget=forms.Textarea)
  40. def send_email(self):
  41. # send email using the self.cleaned_data dictionary
  42. pass
  43. **Example myapp/views.py**::
  44. from myapp.forms import ContactForm
  45. from django.views.generic.edit import FormView
  46. class ContactView(FormView):
  47. template_name = 'contact.html'
  48. form_class = ContactForm
  49. success_url = '/thanks/'
  50. def form_valid(self, form):
  51. # This method is called when valid form data has been POSTed.
  52. # It should return an HttpResponse.
  53. form.send_email()
  54. return super().form_valid(form)
  55. **Example myapp/contact.html**:
  56. .. code-block:: html+django
  57. <form method="post">{% csrf_token %}
  58. {{ form.as_p }}
  59. <input type="submit" value="Send message">
  60. </form>
  61. ``CreateView``
  62. ==============
  63. .. class:: django.views.generic.edit.CreateView
  64. A view that displays a form for creating an object, redisplaying the form
  65. with validation errors (if there are any) and saving the object.
  66. **Ancestors (MRO)**
  67. This view inherits methods and attributes from the following views:
  68. * :class:`django.views.generic.detail.SingleObjectTemplateResponseMixin`
  69. * :class:`django.views.generic.base.TemplateResponseMixin`
  70. * ``django.views.generic.edit.BaseCreateView``
  71. * :class:`django.views.generic.edit.ModelFormMixin`
  72. * :class:`django.views.generic.edit.FormMixin`
  73. * :class:`django.views.generic.detail.SingleObjectMixin`
  74. * :class:`django.views.generic.edit.ProcessFormView`
  75. * :class:`django.views.generic.base.View`
  76. **Attributes**
  77. .. attribute:: template_name_suffix
  78. The ``CreateView`` page displayed to a ``GET`` request uses a
  79. ``template_name_suffix`` of ``'_form'``. For
  80. example, changing this attribute to ``'_create_form'`` for a view
  81. creating objects for the example ``Author`` model would cause the
  82. default ``template_name`` to be ``'myapp/author_create_form.html'``.
  83. .. attribute:: object
  84. When using ``CreateView`` you have access to ``self.object``, which is
  85. the object being created. If the object hasn't been created yet, the
  86. value will be ``None``.
  87. **Example myapp/views.py**::
  88. from django.views.generic.edit import CreateView
  89. from myapp.models import Author
  90. class AuthorCreate(CreateView):
  91. model = Author
  92. fields = ['name']
  93. **Example myapp/author_form.html**:
  94. .. code-block:: html+django
  95. <form method="post">{% csrf_token %}
  96. {{ form.as_p }}
  97. <input type="submit" value="Save">
  98. </form>
  99. ``UpdateView``
  100. ==============
  101. .. class:: django.views.generic.edit.UpdateView
  102. A view that displays a form for editing an existing object, redisplaying
  103. the form with validation errors (if there are any) and saving changes to
  104. the object. This uses a form automatically generated from the object's
  105. model class (unless a form class is manually specified).
  106. **Ancestors (MRO)**
  107. This view inherits methods and attributes from the following views:
  108. * :class:`django.views.generic.detail.SingleObjectTemplateResponseMixin`
  109. * :class:`django.views.generic.base.TemplateResponseMixin`
  110. * ``django.views.generic.edit.BaseUpdateView``
  111. * :class:`django.views.generic.edit.ModelFormMixin`
  112. * :class:`django.views.generic.edit.FormMixin`
  113. * :class:`django.views.generic.detail.SingleObjectMixin`
  114. * :class:`django.views.generic.edit.ProcessFormView`
  115. * :class:`django.views.generic.base.View`
  116. **Attributes**
  117. .. attribute:: template_name_suffix
  118. The ``UpdateView`` page displayed to a ``GET`` request uses a
  119. ``template_name_suffix`` of ``'_form'``. For
  120. example, changing this attribute to ``'_update_form'`` for a view
  121. updating objects for the example ``Author`` model would cause the
  122. default ``template_name`` to be ``'myapp/author_update_form.html'``.
  123. .. attribute:: object
  124. When using ``UpdateView`` you have access to ``self.object``, which is
  125. the object being updated.
  126. **Example myapp/views.py**::
  127. from django.views.generic.edit import UpdateView
  128. from myapp.models import Author
  129. class AuthorUpdate(UpdateView):
  130. model = Author
  131. fields = ['name']
  132. template_name_suffix = '_update_form'
  133. **Example myapp/author_update_form.html**:
  134. .. code-block:: html+django
  135. <form method="post">{% csrf_token %}
  136. {{ form.as_p }}
  137. <input type="submit" value="Update">
  138. </form>
  139. ``DeleteView``
  140. ==============
  141. .. class:: django.views.generic.edit.DeleteView
  142. A view that displays a confirmation page and deletes an existing object.
  143. The given object will only be deleted if the request method is ``POST``. If
  144. this view is fetched via ``GET``, it will display a confirmation page that
  145. should contain a form that POSTs to the same URL.
  146. **Ancestors (MRO)**
  147. This view inherits methods and attributes from the following views:
  148. * :class:`django.views.generic.detail.SingleObjectTemplateResponseMixin`
  149. * :class:`django.views.generic.base.TemplateResponseMixin`
  150. * ``django.views.generic.edit.BaseDeleteView``
  151. * :class:`django.views.generic.edit.DeletionMixin`
  152. * ``django.views.generic.detail.BaseDetailView``
  153. * :class:`django.views.generic.detail.SingleObjectMixin`
  154. * :class:`django.views.generic.base.View`
  155. **Attributes**
  156. .. attribute:: template_name_suffix
  157. The ``DeleteView`` page displayed to a ``GET`` request uses a
  158. ``template_name_suffix`` of ``'_confirm_delete'``. For
  159. example, changing this attribute to ``'_check_delete'`` for a view
  160. deleting objects for the example ``Author`` model would cause the
  161. default ``template_name`` to be ``'myapp/author_check_delete.html'``.
  162. **Example myapp/views.py**::
  163. from django.urls import reverse_lazy
  164. from django.views.generic.edit import DeleteView
  165. from myapp.models import Author
  166. class AuthorDelete(DeleteView):
  167. model = Author
  168. success_url = reverse_lazy('author-list')
  169. **Example myapp/author_confirm_delete.html**:
  170. .. code-block:: html+django
  171. <form method="post">{% csrf_token %}
  172. <p>Are you sure you want to delete "{{ object }}"?</p>
  173. <input type="submit" value="Confirm">
  174. </form>