Зачем мне использовать save(commit=False)
вместо простого создания объекта формы из ModelForm
подкласса и запуска is_valid()
для проверки формы и модели?
Другими словами, для чего save(commit=False)
?
Если вы не возражаете, не могли бы вы представить гипотетические ситуации, в которых это могло бы быть полезно?
django
django-models
django-forms
sgarza62
источник
источник
form = forms.SampleForm(instance = models.Sample)
)commit=False
если вы обрабатываете свою форму вCBV
сdef form_valid
? Можно просто использоватьform.instance.[field]
для обновления?Вот ответ ( из документов ):
# 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)
Наиболее распространенная ситуация - получить экземпляр из формы, но только «в памяти», а не в базе данных. Перед сохранением необходимо внести некоторые изменения:
# Modify the author in some way. >>> new_author.some_field = 'some_value' # Save the new instance. >>> new_author.save()
источник
commit=False
если вы обрабатываете свою форму вCBV
сdef form_valid
? Можно просто использоватьform.instance.[field]
для обновления?Из документов Django:
Кажется, что save (commit = False) действительно создает экземпляр модели, который возвращает вам. Это удобно для пост-обработки перед фактическим сохранением!
источник
В качестве «реального примера» рассмотрим модель пользователя, в которой адрес электронной почты и имя пользователя всегда одинаковы, а затем вы можете перезаписать метод сохранения ModelForm следующим образом:
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
Если вы не использовали
commit=False
для установки имени пользователя адрес электронной почты, вам пришлось бы либо изменить метод сохранения модели пользователя, либо дважды сохранить объект пользователя (что дублирует дорогостоящую операцию с базой данных).источник
commit=False
если вы обрабатываете свою форму вCBV
сdef form_valid
? Можно просто использоватьform.instance.[field]
для обновления?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()
вот мой пример использования save (commit = False). Я хотел проверить, какой тип файла загружает пользователь, прежде чем сохранять его в базе данных. Я также хотел получить дату, когда он был прикреплен, поскольку этого поля не было в форме.
источник