Résolue

Django : form commit=False

# Django # Formulaires

Gabriel Trouvé

Mentor

Bonjour,

J'ai une question existentielle lol.

https://docs.djangoproject.com/en/4.2/topics/forms/modelforms/#the-save-method

Depuis ma formation je n'ai jamais utilisé le paramètre commit de save sur un form.

En fait j'aurais plus tendance à tout faire avant puis save en dernier :

    if request.method == "POST":
        form = MessageForm(request.POST)
        if form.is_valid():
            ticket = Ticket.objects.create(user=user)
            form.instance.user = user
            form.instance.ticket = ticket
            form.save()

Mais c'est peut-être une mauvaise pratique ? Il vaut mieux utiliser le commit ?

Merci d'avance

Thibault houdon

Mentor

Salut Gab !

Ton code fonctionne :) Il n'y a pas vraiment de "mauvaise pratique" comme tu l'imagines. Cependant, le paramètre commit de la méthode save peut devenir super utile dans certaines situations.

En gros, quand tu appelles form.save(), ça enregistre directement le formulaire dans la base de données. Mais parfois, tu voudrais peut-être faire des choses supplémentaires avec l'objet avant de le stocker réellement. C'est là que le paramètre commit=False entre en jeu.

Ce que form.save(commit=False) fait, c'est qu'il crée une instance d'objet à partir de tes données de formulaire, mais il ne le sauvegarde pas encore dans la base de données. Cela te donne l'opportunité de modifier certaines propriétés de cet objet avant de le sauvegarder.

Dans ton exemple, tu peux l'utiliser comme cela à la place de passer par form.instance.

    if request.method == "POST":
        form = MessageForm(request.POST)
        if form.is_valid():
            ticket = Ticket.objects.create(user=user)

            message = form.save(commit=False)
            message.user = user
            message.ticket = ticket
            message.save()

J'ai plus l'habitude de voir du code avec commit=False qu'en utilisant form.instance cependant.

Gabriel Trouvé

Mentor

d'accord merci ! :)

j'utilise form.instance quand je passe par les classes comme CreateView avec la méthode form_valid.

mais là dans lon cas ça fonctionne aussi. donc oas de regles particulières si j'ai bien compris ?

merci Thibault un doute en moins !

Je te dirais que ça dépend surtout de l'endroit où tu travailles à moins que tu sois tout seul sur un projet. Si tu es tout seul : tu peux utiliser ce que tu préfères, ça ne change pas grand-chose. Si tu travailles en équipe : suit les conventions définies par l'équipe (et s'il n'y a pas de convention, parles-en, c'est important d'en avoir en équipe 😄).

Inscris-toi

(c'est gratuit !)

Inscris-toi

Tu dois créer un compte pour participer aux discussions.

Créer un compte

Rechercher sur le site

Formulaire de contact

Inscris-toi à Docstring

Pour commencer ton apprentissage.

Tu as déjà un compte ? Connecte-toi.