Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Django CBV : le mixin CreateView n'appelle pas form_valid

+4 votes

Je cherche à faire en sorte que lorsque mon formulaire de création est validé, django execute un bout de code sur l'objet nouvellement créé.

Apparement on utilise form_valid pour ça, d'après la doc ici

Voici ma classe, très simple :

class FeedCreateView(LoginRequiredMixin, CreateView):
    form_class = FeedForm
    template_name = "feed_form.html"
    success_url = reverse_lazy("admin")

    def form_valid(self, form):
        print "pipou" # jamais appelé :'(
        feed = form.instance
        if isinstance(feed, Feed):
            update_feed(feed)
        return super(CreateView, self).form_valid(form)

Par contre, si je remplace CreateView par FormView.... et bien ça marche. Donc finalement j'ai écrit tout a pour rien, mais j'aimerais bien savoir pourquoi

demandé 8-Fev-2015 par dodo (146 points)

2 Réponses

+1 vote
 
Meilleure réponse

C'était un problème ICC tout bête : j'avais copié collé cette classe plus bas, mais sans le form_valid et surtout sans la renommer! Du coup, la première définition a complètement été ignorée..... arf!

Attention, pour faire fonctionner le form_valid :

def form_valid(self, form):
    redirect = super(FeedCreateView, self).form_valid(form)
    feed = form.instance
    if isinstance(feed, Feed):
        update_feed(feed)
    return redirect

sinon l'objet ne sera pas enregistré

répondu 9-Fev-2015 par dodo (146 points)
sélectionné 9-Fev-2015 par dodo

Le fameux problème de layer8 . ça fait mal ;)

0 votes

CreateView utilise bien form_valid.
Par contre à vue de nez je penche pour un pb avec le mixin.

J'aurai plutôt 'utiliser un décorateur

class FeedCreateView(CreateView):
    ....
    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super(FeedCreateView, self).dispatch(*args, **kwargs)

Et du coup Django révèlerait qui des 2 de loginrequired ou de formvalid pose réellement problème

répondu 8-Fev-2015 par foxmask (2,892 points)

Merci de ta réponse mais j'aurais dû préciser que j'avais tenté en virant ce mixin. A force de tout essayer j'en ai perdu les pédales!!

...