2017-06-12 1 views
0

Lors de la gestion d'une soumission de formulaire, je dois effectuer une logique personnalisée (contacter le service Web, etc.). En cas d'échec je veux empêcher la création d'une nouvelle instance du modèle Car.Retour de form_valid() de CreateView sans enregistrer une instance

Montrons par un simple extrait:

from django.views import generic 
from django.http import HttpResponseRedirect 

class CarCreateView(generic.edit.CreateView): 
     model = Car 
     form_class = CarForm 

     def form_valid(self, form): 

      # some logic that may succeed or fail 

      if success: 
       messages.success(self.request, 'bla bla') 
       return super().form_valid(form) 
      else: 
       messages.error(self.request, 'blabla') 
       # How to return to form index without saving??? 
       return HttpResponseRedirect(self.get_success_url()) 

Ne pas appeler super().form_valid(form) ne suffit pas. Une nouvelle voiture est toujours en cours d'enregistrement. Des idées?

Répondre

1

En fait, j'avais tort tout le long. Erreur stupide. L'exécution n'a jamais atteint ce point lorsque j'ai récupéré la nouvelle instance.

Pour ceux qui cherchent le même problème, la plus propre à gérer cela semble être

return self.render_to_response(self.get_context_data(form=form)).

Ainsi le code ressemblerait à ceci:

from django.views.generic import CreateView 
from django.http import HttpResponseRedirect 

class CarCreateView(CreateView): 
     model = Car 
     form_class = CarForm 

     def form_valid(self, form): 

      # some logic that may succeed or fail 

      if success: 
       messages.success(self.request, 'bla bla') 
       return super(CarCreateView, self).form_valid(form) 
      else: 
       messages.error(self.request, 'blabla') 
       return self.render_to_response(self.get_context_data(form=form)) 

Nous retournons la même page du formulaire, sans créer une nouvelle instance.

0
from django.views.generic import CreateView 
from django.http import HttpResponseRedirect 

class CarCreateView(CreateView): 
     model = Car 
     form_class = CarForm 

     def form_valid(self, form): 

      # some logic that may succeed or fail 

      if success: 
       messages.success(self.request, 'bla bla') 
       return super(CarCreateView, self).form_valid(form) 
      else: 
       messages.error(self.request, 'blabla') 
       return super(CarCreateView, self).form_invalid(form) 
+1

Non. 'form_invalid' est responsable du traitement des erreurs pendant le traitement du formulaire, pas après. En fait, comme je comprends, on ne devrait jamais appeler 'super(). Form_invalid (form)' dans sa méthode 'form_valid()' (ce qui signifie que la forme était valide) – chefarov