/ / Django ModelForm: À quoi sert save (commit = False)? - Django, Modèles Django, Formes Django

Django ModelForm: Qu'est-ce que save (commit = False) utilisé? - django, django-models, django-forms

Pourquoi devrais-je jamais utiliser save(commit=False) au lieu de simplement créer un objet de formulaire à partir de la ModelForm sous-classe et en cours d'exécution is_valid() valider à la fois la forme et le modèle?

En d'autres termes, quelle est save(commit=False) pour?

Si cela ne vous dérange pas, pourriez-vous fournir des situations hypothétiques dans lesquelles cela pourrait être utile?

Réponses:

66 pour la réponse № 1

C’est utile lorsque vous récupérez la plupart des données de votre modèle à partir d’un formulaire, mais que vous devez renseigner certaines données. null=False champs avec des données non-formulaire.

Enregistrer avec commit = False vous donne un objet de modèle, vous pouvez ensuite ajouter vos données supplémentaires et les sauvegarder.

C'est un bon exemple de cette situation.


22 pour la réponse № 2

Ici c'est la réponse (de docs):

# Create a form instance with POST data.
>>> f = AuthorForm(request.POST)

# Create, but don"t save the new author instance.
>>> new_author = f.save(commit=False)

La situation la plus courante consiste à obtenir l'instance à partir du formulaire, mais uniquement "en mémoire", pas dans la base de données. Avant de sauvegarder, vous voulez apporter quelques modifications:

# Modify the author in some way.
>>> new_author.some_field = "some_value"

# Save the new instance.
>>> new_author.save()

5 pour la réponse № 3

De la documentation Django:

Cette méthode save () accepte un commit optionnelargument de mot clé, qui accepte soit Vrai ou Faux. Si vous appelez save () avec commit = False, alors il retournera un objet qui n’a pas encore été enregistré dans la base de données.

Dans ce cas, c’est à vous d’appeler save () lel'instance de modèle résultante. Ceci est utile si vous souhaitez effectuer un traitement personnalisé sur l'objet avant de l'enregistrer. ou si vous souhaitez utiliser l'une des options d'enregistrement de modèle spécialisées. commit est True par défaut.

Il semble que save (commit = False) crée une instance de modèle, qu'elle vous renvoie. Ce qui est intéressant pour certains post-traitements avant de les sauvegarder!


5 pour la réponse № 4

En tant qu '"exemple réel", considérons un modèle utilisateur dans lequel l'adresse électronique et le nom d'utilisateur sont toujours identiques, puis vous pourrez écraser la méthode de sauvegarde de ModelForm, telle que:

class UserForm(forms.ModelForm):
...
def save(self):
# Sets username to email before saving
user = super(UserForm, self).save(commit=False)
user.username = user.email
user.save()
return user

Si vous n’avez pas utilisé commit=False pour définir le nom d’utilisateur sur l’adresse e-mail, vous devez soit modifier la méthode de sauvegarde du modèle utilisateur, soit enregistrer l’objet utilisateur deux fois (ce qui duplique une opération coûteuse de base de données).