¿Por qué usaría en save(commit=False)
lugar de simplemente crear un objeto de formulario a partir de la ModelForm
subclase y ejecutarlo is_valid()
para validar tanto el formulario como el modelo?
En otras palabras, ¿ save(commit=False)
para qué sirve ?
Si no les importa, ¿podrían proporcionar situaciones hipotéticas en las que esto podría ser útil?
django
django-models
django-forms
sgarza62
fuente
fuente
form = forms.SampleForm(instance = models.Sample)
)commit=False
si está procesando su formulario en unCBV
condef form_valid
? ¿Puedes usarform.instance.[field]
para actualizar?Aquí está la respuesta ( de los documentos ):
# 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 situación más común es obtener la instancia del formulario, pero solo "en la memoria", no en la base de datos. Antes de guardarlo, desea realizar algunos cambios:
# Modify the author in some way. >>> new_author.some_field = 'some_value' # Save the new instance. >>> new_author.save()
fuente
commit=False
si está procesando su formulario en unCBV
condef form_valid
? ¿Puedes usarform.instance.[field]
para actualizar?De los documentos de Django:
Parece que save (commit = False) crea una instancia de modelo, que le devuelve. ¡Lo cual es bueno para un procesamiento posterior antes de guardarlo!
fuente
Como un "ejemplo real", considere un modelo de usuario donde la dirección de correo electrónico y el nombre de usuario son siempre los mismos, y luego podría sobrescribir el método de guardado de su ModelForm como:
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 no usó
commit=False
para configurar el nombre de usuario en la dirección de correo electrónico, tendría que modificar el método de guardado del modelo de usuario o guardar el objeto de usuario dos veces (lo que duplica una operación costosa de la base de datos).fuente
commit=False
si está procesando su formulario en unCBV
condef form_valid
? ¿Puedes usarform.instance.[field]
para actualizar?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()
aquí está mi ejemplo de cómo usar save (commit = False). Quería comprobar qué tipo de archivo subió un usuario antes de guardarlo en la base de datos. También quería obtener la fecha en que se adjuntó, ya que ese campo no estaba en el formulario.
fuente