#30648: Using mixins with class-based views wrong explanation of code
-------------------------------------+-------------------------------------
Reporter: Davit Gachechiladze | Owner: nobody
Type: Uncategorized | Status: new
Component: Documentation | Version: 2.2
Severity: Normal | Resolution:
Keywords: | Triage Stage:
| Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | 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.
>
> {{{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 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:1>
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 post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-updates/067.e05f68c5720e3414a5074a5571fd20eb%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.