django - 将未绑定(bind)的表单转换为绑定(bind)的表单?

标签 django django-forms

我想从一个对象中获得一个绑定(bind)表单来使用 is_valid 方法。原因是我有一些旧数据希望用户根据新的验证规则进行更正。然后,我想在我的表单中重用 clean 方法的代码。

我最终序列化了我的回复:

from django.utils import simplejson
from django.core.serializers import serialize

(...)

fields_dict = simplejson.loads(serialize('json', [obj]))[0]['fields']
form = forms.MyForm(fields_dict)
if form.is_valid

这行得通,但它似乎不是很 Djangish。此外,这似乎是一个常见问题,所以我一直在寻找一种更好的方法来做到这一点。

根据文档,将数据从未绑定(bind)形式转换为绑定(bind)形式并不意味着发生:
https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#the-save-method
但是,这对我来说是最简单的解决方案。

最佳答案

有Django的django.forms.models.model_to_dict将现有模型实例转换为适合绑定(bind)到 ModelForm 的数据字典的函数.

这可能比序列化和反序列化对象更有效,而且肯定更“Djangish”。

如果您还使用 instance 创建表单关键字,它会知道在保存时更新现有记录。

所以:

from django.forms.models import model_to_dict

...

fields_dict = model_to_dict(obj)
form = forms.MyForm(fields_dict, instance=obj)

关于django - 将未绑定(bind)的表单转换为绑定(bind)的表单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8993749/

相关文章:

python - Django 管理员保存错误 : get_db_prep_value() got an unexpected keyword argument 'connection'

python - 如何链接使用 Pandas 在函数中创建的 CSV 文件并将其显示在我的 django view/html 中?

django - 根据外键将 django formset 分组

python - POST 数据中缺少 Django 表单输入

python - 更改 Django 管理员 list_display 中的可点击字段

django - 在 VSCode 调试器中设置 GOOGLE_APPLICATION_CREDENTIALS 环境变量

Django:ListView 的 get_object_or_404

python - 确保 django 模板永远不会被任何浏览器缓存

Django boto3 : NoCredentialsError -- Unable to locate credentials

python - 如何以编程方式在 Django 的 ModelForm 中设置字段?