能否将Model解析为ModelForm?如何用Model实例填充并验证其有效性?
借助Model实例填充ModelForm并验证有效性
完全可以用Model实例来填充ModelForm,并且正常调用is_valid()验证数据有效性,主要有两种常用方式:
方式1:使用instance参数
直接将Person实例传给ModelForm的instance参数,表单会自动读取实例的字段值进行填充,无论实例是否已经保存到数据库都能正常工作。
先修正你代码里的语法错误,再给出完整示例:
class Person(models.Model): name = models.CharField(max_length=50) age = models.IntegerField(default=0) class PersonModelForm(ModelForm): class Meta: # ModelForm必须通过Meta类指定关联模型 model = Person fields = '__all__'
if request.method == 'POST': name = request.POST['name'] age = request.POST['age'] person = Person(name=name, age=age) # 传入instance参数完成表单填充 person_form = PersonModelForm(instance=person) if person_form.is_valid(): # 注意要加括号调用is_valid方法 print('person_form 验证通过')
方式2:使用data参数
把Model实例的字段数据转成字典,传给表单的data参数,这种方式相当于把实例数据模拟成表单提交的数据来处理。推荐用Django提供的model_to_dict工具函数,它会自动过滤模型内部属性,只保留业务字段数据:
from django.forms.models import model_to_dict if request.method == 'POST': name = request.POST['name'] age = request.POST['age'] person = Person(name=name, age=age) # 用model_to_dict转换实例为字典,传给data参数 person_form = PersonModelForm(data=model_to_dict(person)) if person_form.is_valid(): print('person_form 验证通过')
关键细节提醒
- 原代码里
PersonModelForm漏写了Meta类,这是ModelForm的必填结构,必须通过Meta指定关联模型和字段; is_valid()是方法,必须加括号调用,原代码里的person_form.is_valid少了括号,会导致判断的是方法对象而非验证结果。
内容的提问来源于stack exchange,提问作者Andrey
相关产品推荐
相关产品推荐

