summaryrefslogtreecommitdiff
path: root/docs/topics/class-based-views/generic-editing.txt
diff options
context:
space:
mode:
Diffstat (limited to 'docs/topics/class-based-views/generic-editing.txt')
-rw-r--r--docs/topics/class-based-views/generic-editing.txt39
1 files changed, 25 insertions, 14 deletions
diff --git a/docs/topics/class-based-views/generic-editing.txt b/docs/topics/class-based-views/generic-editing.txt
index b40d306898..5841c703f6 100644
--- a/docs/topics/class-based-views/generic-editing.txt
+++ b/docs/topics/class-based-views/generic-editing.txt
@@ -23,6 +23,7 @@ Given a contact form:
from django import forms
+
class ContactForm(forms.Form):
name = forms.CharField()
message = forms.CharField(widget=forms.Textarea)
@@ -39,10 +40,11 @@ The view can be constructed using a ``FormView``:
from myapp.forms import ContactForm
from django.views.generic.edit import FormView
+
class ContactFormView(FormView):
- template_name = 'contact.html'
+ template_name = "contact.html"
form_class = ContactForm
- success_url = '/thanks/'
+ success_url = "/thanks/"
def form_valid(self, form):
# This method is called when valid form data has been POSTed.
@@ -102,11 +104,12 @@ First we need to add :meth:`~django.db.models.Model.get_absolute_url()` to our
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})
+ return reverse("author-detail", kwargs={"pk": self.pk})
Then we can use :class:`CreateView` and friends to do the actual
work. Notice how we're just configuring the generic class-based views
@@ -119,17 +122,20 @@ here; we don't have to write any logic ourselves:
from django.views.generic.edit import CreateView, DeleteView, UpdateView
from myapp.models import Author
+
class AuthorCreateView(CreateView):
model = Author
- fields = ['name']
+ fields = ["name"]
+
class AuthorUpdateView(UpdateView):
model = Author
- fields = ['name']
+ fields = ["name"]
+
class AuthorDeleteView(DeleteView):
model = Author
- success_url = reverse_lazy('author-list')
+ success_url = reverse_lazy("author-list")
.. note::
We have to use :func:`~django.urls.reverse_lazy` instead of
@@ -154,9 +160,9 @@ Finally, we hook these new views into the URLconf:
urlpatterns = [
# ...
- path('author/add/', AuthorCreateView.as_view(), name='author-add'),
- path('author/<int:pk>/', AuthorUpdateView.as_view(), name='author-update'),
- path('author/<int:pk>/delete/', AuthorDeleteView.as_view(), name='author-delete'),
+ path("author/add/", AuthorCreateView.as_view(), name="author-add"),
+ path("author/<int:pk>/", AuthorUpdateView.as_view(), name="author-update"),
+ path("author/<int:pk>/delete/", AuthorDeleteView.as_view(), name="author-delete"),
]
.. note::
@@ -193,6 +199,7 @@ the foreign key relation to the model:
from django.contrib.auth.models import User
from django.db import models
+
class Author(models.Model):
name = models.CharField(max_length=200)
created_by = models.ForeignKey(User, on_delete=models.CASCADE)
@@ -210,9 +217,10 @@ to edit, and override
from django.views.generic.edit import CreateView
from myapp.models import Author
+
class AuthorCreateView(LoginRequiredMixin, CreateView):
model = Author
- fields = ['name']
+ fields = ["name"]
def form_valid(self, form):
form.instance.created_by = self.request.user
@@ -234,14 +242,16 @@ works with an API-based workflow as well as 'normal' form POSTs::
from django.views.generic.edit import CreateView
from myapp.models import Author
+
class JsonableResponseMixin:
"""
Mixin to add JSON support to a form.
Must be used with an object-based FormView (e.g. CreateView)
"""
+
def form_invalid(self, form):
response = super().form_invalid(form)
- if self.request.accepts('text/html'):
+ if self.request.accepts("text/html"):
return response
else:
return JsonResponse(form.errors, status=400)
@@ -251,14 +261,15 @@ works with an API-based workflow as well as 'normal' form POSTs::
# it might do some processing (in the case of CreateView, it will
# call form.save() for example).
response = super().form_valid(form)
- if self.request.accepts('text/html'):
+ if self.request.accepts("text/html"):
return response
else:
data = {
- 'pk': self.object.pk,
+ "pk": self.object.pk,
}
return JsonResponse(data)
+
class AuthorCreateView(JsonableResponseMixin, CreateView):
model = Author
- fields = ['name']
+ fields = ["name"]