Por que eu usaria em save(commit=False)
vez de apenas criar um objeto de formulário da ModelForm
subclasse e executar is_valid()
para validar o formulário e o modelo?
Em outras palavras, para que serve save(commit=False)
?
Se você não se importa, vocês poderiam fornecer situações hipotéticas em que isso possa ser útil?
django
django-models
django-forms
sgarza62
fonte
fonte
form = forms.SampleForm(instance = models.Sample)
)commit=False
se estiver processando seu formulário em umCBV
comdef form_valid
? Você pode apenas usarform.instance.[field]
para atualizar?Aqui está a resposta ( dos 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)
A situação mais comum é obter a instância do formulário, mas apenas 'na memória', não no banco de dados. Antes de salvá-lo, você deseja fazer algumas alterações:
# Modify the author in some way. >>> new_author.some_field = 'some_value' # Save the new instance. >>> new_author.save()
fonte
commit=False
se estiver processando seu formulário em umCBV
comdef form_valid
? Você pode apenas usarform.instance.[field]
para atualizar?Dos documentos do Django:
Parece que save (commit = False) cria uma instância de modelo, que retorna para você. O que é ótimo para algum pós-processamento antes de realmente salvá-lo!
fonte
Como um "exemplo real", considere um modelo de usuário onde o endereço de e-mail e o nome de usuário são sempre os mesmos, e então você pode sobrescrever o método save do seu 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
Se você não usou
commit=False
para definir o nome de usuário para o endereço de e-mail, teria que modificar o método de salvamento do modelo de usuário ou salvar o objeto de usuário duas vezes (o que duplica uma operação cara do banco de dados).fonte
commit=False
se estiver processando seu formulário em umCBV
comdef form_valid
? Você pode apenas usarform.instance.[field]
para atualizar?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()
aqui está meu exemplo de uso de save (commit = False). Eu queria verificar que tipo de arquivo um usuário carregou antes de salvá-lo no banco de dados. Também queria obter a data em que foi anexado, pois esse campo não estava no formulário.
fonte