将输入验证与Django项目中的模型级验证分开是否典型?例如,验证用户名是否符合命名标准将是输入验证,并验证用户尚未在数据库中,将是模型级验证。
我一直在查看同事的代码,他们将两种类型的验证都放在表单类中(在forms.py中)。这是典型的设置,还是模型或视图中出现的模型级验证更常见?
还是有更好的方法来接近这一点 - 例如使用ModelForm
?我对Django很新,并试图了解这种情况的推荐模式。
答案 0 :(得分:13)
这是一个非常有趣的问题(对我而言)。
在我看来,所有验证代码都应该移到模型代码中。这是不破坏业务规则的方法。当验证代码在模型中时,不可能以新的形式忘记某些验证或者以多种形式存在不一致的规则。
我链接到与您有关的'Django, Raise a validation error in a model's save method'问题。在下面的问题中,您可以看到如何将代码验证从表单移动到模型。我希望这个简短的介绍对您有所帮助。
你来自哪个框架?如何在您的环境中写出验证规则?
答案 1 :(得分:8)
我不同意接受的答案。我更喜欢使用模型级验证来避免模型中的不一致,以及针对任何特定于站点的限制的表单级验证。
假设我们有一个事件模型,其中包含开始和结束时间的datetime
字段。模型验证会迫使我们在开始时间之后有一个结束时间。但是,我会将其保留在表单中,以验证新创建的事件不在过去。因此,如果我必须添加过去发生的事件,我可以使用特定于管理员的表单,该表单允许过去的日期,或者只是将其直接添加到数据库中。
因此,模型验证应该只检查明显错误的值。但是如果你需要做一些时髦的东西(例如机器人的用户名中的Unicode字符),它应该让你这样做,即使它只是通过管理员或shell。我已经阅读了StackOverflow的答案,该答案建议始终在后端代码中使用表单,使用form["field"] = "value"
等代码填充字段,以便从一致的验证中受益。