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)
这是预期的行为吗?我如何更改这一点,以便我可以确保如果在表单中未指定字段,但实例中是否存在未被空字符串覆盖的字段?
请注意,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)
| 归档时间: |
|
| 查看次数: |
1819 次 |
| 最近记录: |