Accessing request.user in class based generic view CreateView in order to set FK field in Django

Solution 1:

How about overriding form_valid which does the form saving? Save it yourself, do whatever you want to it, then do the redirect.

class PlaceFormView(CreateView):
    form_class = PlaceForm

    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super(PlaceFormView, self).dispatch(*args, **kwargs)

    def form_valid(self, form):
        obj = form.save(commit=False)
        obj.created_by = self.request.user
        obj.save()        
        return http.HttpResponseRedirect(self.get_success_url())

Solution 2:

I know that this is old, but for other people with this problem:

There is an even simpler way - since saving a form multiple times will always use the same model instance, you can also do:

def form_valid(self, form):
    obj = form.save(commit=False)
    obj.created_by = self.request.user
    return super(PlaceFormView, self).form_valid(form)

That way, you get all the benefits of the super call - it's trivial to see that you're really only adding those two lines of code, and you don't have to repeat yourself by replicating the redirect logic.