#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 django-updates+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/067.ba8da6acde72918c809bdc568efe921c%40djangoproject.com.

Reply via email to