Search code examples
djangodjango-viewsdjango-generic-views

CreateView + redefinition of form_valid = didn't return an HttpResponse object


Django 1.10strong text

Could you help me understand why this results in:

The view wiki.views.WikiCreate didn't return an HttpResponse object. It returned None instead.

post: I didn't interfere with the chain of inheritance when redefining post method. I just intercepted the parameters from url.

form_valid: I returned the HttpResponse. But seemingly somewhere later it disappeared.

urlpatterns = [
    url(r'^(?P<model>[-\w]+)/(?P<pk>\d+)/wiki/create/$', WikiCreate.as_view(), name='wiki_create'),
]



class WikiCreate(CreateView):
    model = Wiki
    fields = ['article']

    def post(self, request, *args, **kwargs):
        #For wiki history.
        self.author = request.user

        # Parameters from url reflect fields not shown to user.
        self.related_model = kwargs.get('model')
        self.related_object_id = kwargs.get('pk')

        super(WikiCreate, self).post(request, *args, **kwargs)

    def form_valid(self, form):
        """
        Only "article" field was shown to tue user.
        Now we save fields that were not explicitly shown (but were in the url).
        """
        self.object = form.save(commit=False)
        self.object.related_model = self.related_model
        self.object.related_id = self.related_object_id
        self.object.save()
        return HttpResponseRedirect(self.get_success_url())

Solution

  • You didn't return the response from the super call in post.

    Note it's rarely a good idea to override that method, and you certainly didn't need to here. You can access those kwargs directly in form_valid.