7

В моем CreateView классе я переопределение функции form_valid() следующим образом:Джанго: метод ОЦК form_valid() не называется

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) 

Но, как выясняется, метод form_valid никогда не вызывается, потому что user никогда не печатается , Интересно, что вызывается метод clean в form.py.

Не отображается ошибка (поэтому у меня нет следа для отображения). Пользователь снова перенаправляется в форму. В чем причина такого поведения? Я работаю на Django 1.5 и Python 2.7.

+3

Вы попробовали инструкцию печати в методе 'form_invalid', и используете ли вы' POST'? –

+1

создание метода 'form_invalid' показало проблему. Спасибо за предложение. Если вы напишете свой комментарий в качестве ответа, я с удовольствием соглашусь и проголосую за него. Спасибо. – neurix

+0

Я столкнулся с подобной проблемой, и 'form_invalid' тоже помог мне. Я понял, что форма создавала ошибку, в которой я не размещался в шаблоне, поэтому она не отображалась. Это похоже на то, с чем вы столкнулись @neurix? –

ответ

2

form.instance.user = self.request.user неправильно

Пожалуйста, попробуйте этот вариант:

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. Вам действительно нужно изменить get_initial? На вашем коде я не вижу этой необходимости.

1

Возможно, форма не действительна. Вы можете переопределить form_invalid() и посмотреть, вызвано ли это, или переопределить post(), и посмотреть, какие данные POSTED.