Bienvenue sur IndexError.

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

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

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,888 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!!

...