gpt4 book ai didi

python - 将 Django 模型验证错误传输到表单的惯用方法

转载 作者:太空狗 更新时间:2023-10-29 21:35:26 24 4
gpt4 key购买 nike

请帮助我理解我做出的以下选择是否符合惯用/良好,如果不是,如何改进。

1) 模型验证优于表单验证
我更喜欢使用新的model validation尽可能多地进行表单验证,因为它似乎是一种为数据创建规则的更干燥和基本的方法。简单日历条目模型的两个示例:

  • “开始必须在结束之前”
  • “周期必须小于(end-start)”

将它们放在模型级别以便不必将它们放入表单中是否符合惯用/良好?如果 ModelForm 是最佳答案,那么在同一个表单中使用多个模型的情况又如何呢?
(编辑:我没有意识到多个ModelForms实际上可以一起使用)

2) 将模型验证转移到表单(不是 ModelForm)
(编辑:事实证明,在我的情况下,不需要重新设计模型验证和表单验证之间的管道,下面的解决方案说明了原因)
让我们暂时假设我遇到的任何模型验证错误都可以直接传输并直接显示给用户(即忽略将模型验证错误转换为用户友好的表单验证错误)。

这是我想出的一种工作方式(都在一个地方,没有辅助函数):

view_with_a_form:
...
if form.is_valid():
instance = ...
...
#save() is overridden to do full_clean with optional exclusions
try: instance.save()
except ValidationError e:
nfe= e.message_dict[NON_FIELD_ERRORS]
#this is one big question mark:
instance._errors['__all__'] = ErrorList(nfe)
#this is the other big question mark. seems unnatural
if form.is_valid()
return response...
... #other code in standard format
#send the user the form as 1)new 2)form errors 3)model errors
return form

如代码中注释:
a) 这是将模型错误转移到表单的惯用/好方法吗?

b) 这是测试新“表单”错误的惯用/好方法吗?

注意:此示例使用非字段错误,但我认为它同样适用于字段错误。

最佳答案

[已编辑 - 希望这能回答您的意见]

我会简短而直接,但不想不礼貌 :)

1) 模型验证优于表单验证

我想经验法则可能是,只要规则确实与模型相关联,是的,最好在模型级别进行验证。

对于多模型表单,请查看其他 SO 问题:Django: multiple models in one template using forms , 不要忘记 attached link这有点旧但仍然与实现它的最干燥方式相关。在这里重新讨论它太长了!

2)

  • a) 不!您应该从将执行 model validation 的 ModelForm 派生表单。为你 -> 你不需要自己调用模型验证
  • b) 不!如果你想验证一个模型,你不应该尝试保存它;你应该使用 full_clean -> 因此,如果您的 ModelForm 有效,那么您就知道该模型也有效,您可以保存。

是的,即使是多模型表单,这些答案仍然适用。

所以你应该做的是:

  • 仍然使用ModelForm
  • 不必担心验证模型,因为 ModelForm 会为您完成。

一般来说,如果您发现自己在使用 django 做一些管道工程,那是因为还有另一种更简单的方法!

第二个指针应该让你开始并实际上简化你的代码......

关于python - 将 Django 模型验证错误传输到表单的惯用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7736596/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com