#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               |       Keywords:
           Triage Stage:  Unreviewed           |      Has patch:  0
    Needs documentation:  0                    |    Needs tests:  0
Patch needs improvement:  0                    |  Easy pickings:  0
                  UI/UX:  0                    |
-----------------------------------------------+------------------------
 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}}}.

-- 
Ticket URL: <https://code.djangoproject.com/ticket/30648>
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/052.a58da106bcc8c290858b6a8e8b49648f%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to