#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.