7

W moim CreateView klasie mam nadrzędnych funkcji form_valid() następująco:Django: CBV metoda form_valid() nie nazywa

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) 

Ale jak się okazuje, metoda form_valid nigdy nazywa ponieważ user nigdy nie jest drukowany . Co ciekawe, wywoływana jest metoda clean w pliku forms.py.

Nie wyświetla się żaden błąd (w związku z tym nie mam żadnego śledzenia do wyświetlenia). Użytkownik jest ponownie przekierowywany do formularza. Jaki może być powód takiego zachowania? Używam Django 1.5 i Python 2.7.

+3

Czy wypróbowałeś polecenie drukowania w metodzie 'form_invalid' i używasz' POST'? –

+1

Tworzenie metody "form_invalid" ujawniło problem. Dziękuję za sugestię. Jeśli napiszesz swój komentarz jako odpowiedź, z przyjemnością przyjmiemy go i zagłosujemy. Dziękuję Ci. – neurix

+0

Wpadłem na podobny problem, a pomógł mi również "form_invalid". Zdałem sobie sprawę, że w formularzu wystąpił błąd, którego nie uwzględniłem w szablonie, więc nie wyświetlił się. Czy to jest podobne do tego, co spotkałeś @neurix? –

Odpowiedz

2

form.instance.user = self.request.user jest źle

Spróbuj ten wariant:

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) 

PS: Naprawdę potrzebujesz zmiany get_initial? Na twoim kodzie nie widzę, żeby ta potrzeba.

1

Jest prawdopodobne, że formularz jest nieprawidłowy. Można zastąpić metodę form_invalid() i sprawdzić, czy jest ona wywoływana, lub przesłonić post() i zobaczyć, jakie dane są POSTed.

Powiązane problemy