关于 Django Form 和 UpdateView 配合使用的问题

2019-06-26 17:24:18 +08:00
 piaochen0

背景简化如下:
Model 部分:Model 名为 Task,Task 中有一个 name 字段,该字段唯一 unique=True,
Form 部分:根据 Task 的 Model,构造了一个 ModelForm TaskForm
View 部分,使用 CreateView,UpdateView 对此 Task 进行增加,修改。

问题:在 UpdateView 中,因为要对前端传过来的数值进行一些加工后保存,所以重写了 form_valid 方法。在该方法中,使用 task = form.save(commit=False) 的时候,会直接触发 name 字段的唯一性验证。直接就报错跳出了。

另外一个问题。假如我去掉 unique 验证,此时 task = form.save(commit=False)获取的 task,是不包含 id 的。我选择 save 操作,数据库里会多出一条数据。而不是在之前记录上修改的。 这里如何处理?还是需要手动指定 ID?

django 新手。求指教。多谢。

2977 次点击
所在节点    Django
3 条回复
asilin
2019-06-26 17:51:49 +08:00
不需要 commit=False,在 save() 之前,你可以通过 form.instance 来获取 /修改表单的数据,处理完逻辑之后再 save() 即可。

具体可以参阅: https://docs.djangoproject.com/en/1.11/topics/forms/modelforms/#s-overriding-clean-on-a-modelformset
piaochen0
2019-06-27 09:07:55 +08:00
@asilin 非常感谢,不过我发现一个问题,因为我的 name 字段唯一性的限制,提交表单后,该表单会验证不通过。使用 form.instance 来取值,里面的所有的字段值都是空的。必须要先表单验证通过后,才行。这种情况怎么处理呢?
piaochen0
2019-06-27 09:27:58 +08:00
@asilin 我已经解决了,原来是我在 ModelForm 中,没有把 id 包括在 fields 中,真的非常感谢你。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/577723

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX