#30648: Overriding get_context_data() is unnecessary in the "Using FormMixin
with
DetailView" example.
-------------------------------------+-------------------------------------
Reporter: Davit Gachechiladze | Owner: Davit
Type: | Gachechiladze
Cleanup/optimization | Status: closed
Component: Documentation | Version: master
Severity: Normal | Resolution: fixed
Keywords: | Triage Stage: Accepted
Has patch: 1 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 1 | UI/UX: 0
-------------------------------------+-------------------------------------
Description changed by Davit Gachechiladze:
Old description:
> The following code snippet is from from
> https://docs.djangoproject.com/en/2.2/topics/class-based-views/mixins
> /#using-formmixin-with-detailview
>
> {{{
> CAUTION: you almost certainly do not want to do this.
> # It is provided as part of a discussion of problems you can
> # run into when combining different generic class-based view
> # functionality that is not designed to be used together.
>
> from django import forms
> from django.http import HttpResponseForbidden
> from django.urls import reverse
> from django.views.generic import DetailView
> from django.views.generic.edit import FormMixin
> from books.models import Author
>
> class AuthorInterestForm(forms.Form):
> message = forms.CharField()
>
> class AuthorDetail(FormMixin, DetailView):
> model = Author
> form_class = AuthorInterestForm
>
> def get_success_url(self):
> return reverse('author-detail', kwargs={'pk': self.object.pk})
>
> def get_context_data(self, **kwargs):
> context = super().get_context_data(**kwargs)
> context['form'] = self.get_form()
> return context
>
> def post(self, request, *args, **kwargs):
> if not request.user.is_authenticated:
> return HttpResponseForbidden()
> self.object = self.get_object()
> form = self.get_form()
> if form.is_valid():
> return self.form_valid(form)
> else:
> return self.form_invalid(form)
>
> def form_valid(self, form):
> # Here, we would record the user's interest using the message
> # passed in form.cleaned_data['message']
> return super().form_valid(form)
> }}}
>
> {{{get_success_url()}}} is just providing somewhere to redirect to, which
> gets used in the default implementation of {{{form_valid()}}}. We have to
> provide our own post() as noted earlier, and override
> {{{get_context_data()}}} to make the {{{Form}}} available in the context
> data.
>
> Sentence above is mistake, isn't it ? Because {{{get_context_data()}}}
> does not require override to capture {{{Form}}} inside context. It's done
> automatically by {{{FormMixin}}}.
New description:
The following code snippet is from
https://docs.djangoproject.com/en/2.2/topics/class-based-views/mixins
/#using-formmixin-with-detailview
{{{
CAUTION: you almost certainly do not want to do this.
# It is provided as part of a discussion of problems you can
# run into when combining different generic class-based view
# functionality that is not designed to be used together.
from django import forms
from django.http import HttpResponseForbidden
from django.urls import reverse
from django.views.generic import DetailView
from django.views.generic.edit import FormMixin
from books.models import Author
class AuthorInterestForm(forms.Form):
message = forms.CharField()
class AuthorDetail(FormMixin, DetailView):
model = Author
form_class = AuthorInterestForm
def get_success_url(self):
return reverse('author-detail', kwargs={'pk': self.object.pk})
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['form'] = self.get_form()
return context
def post(self, request, *args, **kwargs):
if not request.user.is_authenticated:
return HttpResponseForbidden()
self.object = self.get_object()
form = self.get_form()
if form.is_valid():
return self.form_valid(form)
else:
return self.form_invalid(form)
def form_valid(self, form):
# Here, we would record the user's interest using the message
# passed in form.cleaned_data['message']
return super().form_valid(form)
}}}
{{{get_success_url()}}} is just providing somewhere to redirect to, which
gets used in the default implementation of {{{form_valid()}}}. We have to
provide our own post() as noted earlier, and override
{{{get_context_data()}}} to make the {{{Form}}} available in the context
data.
Sentence above is mistake, isn't it ? Because {{{get_context_data()}}}
does not require override to capture {{{Form}}} inside context. It's done
automatically by {{{FormMixin}}}.
--
--
Ticket URL: <https://code.djangoproject.com/ticket/30648#comment:8>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-updates/067.ba8da6acde72918c809bdc568efe921c%40djangoproject.com.