generic-editing.txt 8.0 KB

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