Django ModelForm是否将未指定的字段设置为空?

9-b*_*its 3 django django-forms

我有一个看起来像这样的模型:

class MyModel(Model):
  name = models.TextField(blank=True, default='')
  bio = models.TextField(blank=True, default='')
Run Code Online (Sandbox Code Playgroud)

和一个看起来像这样的ModelForm:

class MyModelForm(ModelForm):

  class Meta:
      model = MyModel
      fields = ('name', 'bio')
Run Code Online (Sandbox Code Playgroud)

当我创建/初始化我的表单时:

form = MyModelForm(instance=my_model, data={'bio': 'this is me'})  # where my_model has a name already set
Run Code Online (Sandbox Code Playgroud)

然后:

form.is_valid() # evaluates to true
form.save() # overwrites the name field in my_model and makes it blank!
Run Code Online (Sandbox Code Playgroud)

这是预期的行为吗?我如何更改这一点,以便我可以确保如果在表单中未指定字段,但实例中是否存在未被空字符串覆盖的字段?

Ala*_*air 8

请注意,Django仅将name字段设置为空,因为您已设置blank=True.如果需要该字段,则会出现验证错误.

最近讨论了django-developers组关于改变这种行为的问题.核心开发者阿德里安和保罗赞成目前的行为.

因此,如果您要对使用blank = True的模型使用此视图的模型表单,则需要在数据字典中包含所有模型字段.您可以使用此功能model_to_dict.

from django.forms.models import model_to_dict
data = model_to_dict(my_model)
data.update({'bio': 'this is me'}) # or data.update(request.POST) 
form = MyModelForm(instance=my_model, data=data)
Run Code Online (Sandbox Code Playgroud)