Pourquoi utiliserais-je save(commit=False)
au lieu de simplement créer un objet de formulaire à partir de la ModelForm
sous - classe et de l'exécuter is_valid()
pour valider à la fois le formulaire et le modèle?
En d'autres termes, à quoi ça sert save(commit=False)
?
Si cela ne vous dérange pas, pourriez-vous fournir des situations hypothétiques où cela pourrait être utile?
django
django-models
django-forms
sgarza62
la source
la source
form = forms.SampleForm(instance = models.Sample)
)commit=False
si vous traitez votre formulaire dans unCBV
avecdef form_valid
? Pouvez-vous simplement utiliserform.instance.[field]
pour mettre à jour?Voici la réponse ( tirée de la documentation ):
# 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 est d'obtenir l'instance à partir du formulaire mais uniquement «en mémoire», pas dans la base de données. Avant de l'enregistrer, vous souhaitez apporter des modifications:
# Modify the author in some way. >>> new_author.some_field = 'some_value' # Save the new instance. >>> new_author.save()
la source
commit=False
si vous traitez votre formulaire dans unCBV
avecdef form_valid
? Pouvez-vous simplement utiliserform.instance.[field]
pour mettre à jour?À partir de la documentation Django:
Il semble que save (commit = False) crée une instance de modèle, qu'il vous renvoie. Ce qui est bien pour un post-traitement avant de l'enregistrer!
la source
Comme "vrai exemple", considérez un modèle d'utilisateur où l'adresse e-mail et le nom d'utilisateur sont toujours les mêmes, puis vous pouvez remplacer la méthode d'enregistrement de votre ModelForm comme:
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 devrez soit modifier la méthode d'enregistrement du modèle utilisateur, soit enregistrer l'objet utilisateur deux fois (ce qui duplique une opération de base de données coûteuse.)la source
commit=False
si vous traitez votre formulaire dans unCBV
avecdef form_valid
? Pouvez-vous simplement utiliserform.instance.[field]
pour mettre à jour?form = AddAttachmentForm(request.POST, request.FILES) if form.is_valid(): attachment = form.save(commit=False) attachment.user = student attachment.attacher = self.request.user attachment.date_attached = timezone.now() attachment.competency = competency attachment.filename = request.FILES['attachment'].name if attachment.filename.lower().endswith(('.png','jpg','jpeg','.ai','.bmp','.gif','.ico','.psd','.svg','.tiff','.tif')): attachment.file_type = "image" if attachment.filename.lower().endswith(('.mp4','.mov','.3g2','.avi','.flv','.h264','.m4v','.mpg','.mpeg','.wmv')): attachment.file_type = "video" if attachment.filename.lower().endswith(('.aif','.cda','.mid','.midi','.mp3','.mpa','.ogg','.wav','.wma','.wpl')): attachment.file_type = "audio" if attachment.filename.lower().endswith(('.csv','.dif','.ods','.xls','.tsv','.dat','.db','.xml','.xlsx','.xlr')): attachment.file_type = "spreasheet" if attachment.filename.lower().endswith(('.doc','.pdf','.rtf','.txt')): attachment.file_type = "text" attachment.save()
voici mon exemple d'utilisation de save (commit = False). Je voulais vérifier quel type de fichier un utilisateur a téléchargé avant de l'enregistrer dans la base de données. Je voulais aussi connaître la date à laquelle il était attaché puisque ce champ n'était pas dans le formulaire.
la source