generic-editing.txt 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  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. **Example myapp/views.py**::
  80. from django.views.generic.edit import CreateView
  81. from myapp.models import Author
  82. class AuthorCreate(CreateView):
  83. model = Author
  84. fields = ['name']
  85. **Example myapp/author_form.html**:
  86. .. code-block:: html+django
  87. <form action="" method="post">{% csrf_token %}
  88. {{ form.as_p }}
  89. <input type="submit" value="Create" />
  90. </form>
  91. UpdateView
  92. ----------
  93. .. class:: django.views.generic.edit.UpdateView
  94. A view that displays a form for editing an existing object, redisplaying
  95. the form with validation errors (if there are any) and saving changes to
  96. the object. This uses a form automatically generated from the object's
  97. model class (unless a form class is manually specified).
  98. **Ancestors (MRO)**
  99. This view inherits methods and attributes from the following views:
  100. * :class:`django.views.generic.detail.SingleObjectTemplateResponseMixin`
  101. * :class:`django.views.generic.base.TemplateResponseMixin`
  102. * ``django.views.generic.edit.BaseUpdateView``
  103. * :class:`django.views.generic.edit.ModelFormMixin`
  104. * :class:`django.views.generic.edit.FormMixin`
  105. * :class:`django.views.generic.detail.SingleObjectMixin`
  106. * :class:`django.views.generic.edit.ProcessFormView`
  107. * :class:`django.views.generic.base.View`
  108. **Attributes**
  109. .. attribute:: template_name_suffix
  110. The ``UpdateView`` page displayed to a ``GET`` request uses a
  111. ``template_name_suffix`` of ``'_form'``. For
  112. example, changing this attribute to ``'_update_form'`` for a view
  113. updating objects for the example ``Author`` model would cause the
  114. default ``template_name`` to be ``'myapp/author_update_form.html'``.
  115. **Example myapp/views.py**::
  116. from django.views.generic.edit import UpdateView
  117. from myapp.models import Author
  118. class AuthorUpdate(UpdateView):
  119. model = Author
  120. fields = ['name']
  121. template_name_suffix = '_update_form'
  122. **Example myapp/author_update_form.html**:
  123. .. code-block:: html+django
  124. <form action="" method="post">{% csrf_token %}
  125. {{ form.as_p }}
  126. <input type="submit" value="Update" />
  127. </form>
  128. DeleteView
  129. ----------
  130. .. class:: django.views.generic.edit.DeleteView
  131. A view that displays a confirmation page and deletes an existing object.
  132. The given object will only be deleted if the request method is ``POST``. If
  133. this view is fetched via ``GET``, it will display a confirmation page that
  134. should contain a form that POSTs to the same URL.
  135. **Ancestors (MRO)**
  136. This view inherits methods and attributes from the following views:
  137. * :class:`django.views.generic.detail.SingleObjectTemplateResponseMixin`
  138. * :class:`django.views.generic.base.TemplateResponseMixin`
  139. * ``django.views.generic.edit.BaseDeleteView``
  140. * :class:`django.views.generic.edit.DeletionMixin`
  141. * ``django.views.generic.detail.BaseDetailView``
  142. * :class:`django.views.generic.detail.SingleObjectMixin`
  143. * :class:`django.views.generic.base.View`
  144. **Attributes**
  145. .. attribute:: template_name_suffix
  146. The ``DeleteView`` page displayed to a ``GET`` request uses a
  147. ``template_name_suffix`` of ``'_confirm_delete'``. For
  148. example, changing this attribute to ``'_check_delete'`` for a view
  149. deleting objects for the example ``Author`` model would cause the
  150. default ``template_name`` to be ``'myapp/author_check_delete.html'``.
  151. **Example myapp/views.py**::
  152. from django.views.generic.edit import DeleteView
  153. from django.core.urlresolvers import reverse_lazy
  154. from myapp.models import Author
  155. class AuthorDelete(DeleteView):
  156. model = Author
  157. success_url = reverse_lazy('author-list')
  158. **Example myapp/author_confirm_delete.html**:
  159. .. code-block:: html+django
  160. <form action="" method="post">{% csrf_token %}
  161. <p>Are you sure you want to delete "{{ object }}"?</p>
  162. <input type="submit" value="Confirm" />
  163. </form>