7

In meiner CreateView Klasse namens ich das Überschreiben der form_valid() Funktion wie folgt:Django: CBV Methode form_valid() nicht

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) 

Aber es stellt sich heraus, die form_valid Methode wird aufgerufen, nie, weil die user nie gedruckt wird . Interessanterweise wird die Methode clean in forms.py aufgerufen.

Es wird kein Fehler angezeigt (daher habe ich kein Traceback zur Anzeige). Der Benutzer wird einfach erneut zum Formular weitergeleitet. Was könnte der Grund für dieses Verhalten sein? Ich laufe auf Django 1.5 und Python 2.7.

+3

Haben Sie eine print-Anweisung innerhalb der 'form_invalid'-Methode versucht und verwenden Sie' POST'? –

+1

Erstellen der 'Form_invalid' Methode offenbarte das Problem. Danke für den Vorschlag. Wenn Sie Ihren Kommentar als Antwort schreiben, stimme ich gerne zu und stimme ihn ab. Vielen Dank. – neurix

+0

Ich stieß auf ein ähnliches Problem, und 'form_invalid' half mir auch. Ich erkannte, dass das Formular einen Fehler darstellte, den ich in der Vorlage nicht berücksichtigte, sodass es nicht angezeigt wurde. Ist das ähnlich wie bei @neurix? –

Antwort

2

form.instance.user = self.request.user ist falsch

Bitte versuchen Sie es mit dieser Variante:

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. Sie brauchen wirklich ändern get_initial? Auf dem Code sehe ich das nicht.

1

Es ist wahrscheinlich, dass das Formular nicht gültig ist. Sie könnten form_invalid() überschreiben und sehen, ob das aufgerufen wird, oder post() überschreiben und sehen, welche Daten an den POST gesendet werden.