[Django]-Problem with mixing Detail View and Form Mixin django

5👍

The reason that this happens is because you construct a new form that you pass to the context data, as a result, it will not render any errors, since you construct a form without validating the request data and render that form, you thus do not display the form that rejected the data in the first place.

But you do not need to do that. Django’s FormMixin [Django-doc] already takes care of that. You thus should not override the .get_context_data(…) method [Django-doc].

Another problem is that you did not save your form, you can override a the form_valid method, or you can inherit from ModelFormMixin [Django-doc].

Finally you better first create the form, and then assign self.object, otherwise it will pass this as an instance to the form:

from django.views.generic.edit import ModelFormMixin

class DetailPostView(ModelFormMixin, DetailView):
    model = Post
    template_name = 'blog/post_detail.html'
    context_object_name = 'posts'
    form_class = CommentForm

    # no get_context_data override

    def post(self, request, *args, **kwargs):
        # first construct the form to avoid using it as instance
        form = self.get_form()
        self.object = self.get_object()
        if form.is_valid():
            return self.form_valid(form)
        else:
            return self.form_invalid(form)

    def get_success_url(self):
        return reverse('post-detail', kwargs={'pk': self.object.pk})

Leave a comment