Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django: CBV method form_valid() not called

In my CreateView class I am overriding the form_valid() function as follows:

class ActionCreateView(CreateView):
    model = Action
    form_class = ActionCreateForm
    success_url = reverse_lazy('profile')

    def get_initial(self):
        initial = super(ActionCreateView, self).get_initial()
        initial['request'] = self.request
        return initial

    def form_valid(self, form):
        form.instance.user = self.request.user
        print 'user: %s'%form.instance.user
        try:
            da = form.cleaned_data['deadline_date']
            ti = datetime.now()
            form.instance.deadline = datetime(da.year, da.month, da.day, ti.hour, ti.minute, ti.second )
        except Exception:
            raise Http404
        return super(ActionCreateView, self).form_valid(form)

But as it turns out, the form_valid method is never called because the user is never printed. Interestingly, the clean method in the forms.py is called.

No error is displayed (therefore I do not have a traceback to display). The user is just redirected to the form again. What could be the reason for this behaviour? I'm running on Django 1.5 and Python 2.7.

like image 418
neurix Avatar asked May 17 '13 14:05

neurix


Video Answer


2 Answers

It is likely that the form is not valid. You could override form_invalid() and see if that is called, or override post() and see what data is being POSTed.

like image 101
askvictor Avatar answered Oct 06 '22 02:10

askvictor


form.instance.user = self.request.user is wrong

Please try this variant:

def form_valid(self, form):
    self.object = form.save(commit=False)  
    if self.request.user.is_authenticated():
        self.object.user = self.request.user
    # Another computing etc
    self.object.save()
    return super(ActionCreateView, self).form_valid(form)

P.S. You really need change get_initial? On you code i don't see that this need.

like image 29
nnmware Avatar answered Oct 06 '22 02:10

nnmware