7

Nella mia classe CreateView sto Superamento della funzione form_valid() come segue:Django: Metodo CBV form_valid() non chiamato

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) 

Ma, come si è visto, il metodo form_valid non viene mai chiamato perché il user non viene mai stampato . È interessante notare che il metodo clean nel forms.py viene chiamato.

Nessun errore visualizzato (pertanto non è necessario visualizzare una traccia). L'utente viene nuovamente reindirizzato al modulo. Quale potrebbe essere la ragione di questo comportamento? Sono in esecuzione su Django 1.5 e Python 2.7.

+3

Hai provato un'istruzione di stampa nel metodo 'form_invalid' e stai usando' POST'? –

+1

creazione del metodo 'form_invalid' ha rivelato il problema. Grazie per il suggerimento. Se scrivi il tuo commento come risposta, sono felice di accettarlo e votarlo. Grazie. – neurix

+0

Mi sono imbattuto in un problema simile e anche 'form_invalid' mi ha aiutato. Mi sono reso conto che il modulo stava visualizzando un errore per il quale non ero accomodante nel modello, quindi non è stato visualizzato. È simile a quello che hai incontrato @neurix? –

risposta

2

form.instance.user = self.request.user è sbagliato

Si prega di provare questa 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. Hai davvero bisogno di cambiare get_initial? Sul tuo codice non vedo che questa necessità.

1

È probabile che il modulo non sia valido. È possibile sovrascrivere form_invalid() e vedere se viene chiamato, o sovrascrivere post() e vedere quali dati vengono sottoposti a POST.

Problemi correlati