在Django中分离表单输入和模型验证?

在Django中分离表单输入和模型验证?,django,django-models,django-forms,django-views,Django,Django Models,Django Forms,Django Views,在Django项目中,将输入验证与模型级验证分开是典型的做法吗?例如,验证用户名是否符合命名标准将是输入验证,验证用户不在数据库中将是模型级验证 我一直在看一位同事的代码,他们将这两种类型的验证都放在一个表单类中(在forms.py中)。这是典型的设置,还是模型级验证更常见地出现在模型或视图中 或者有没有更好的方法来实现这一点——比如使用模型形式?我是Django的新手,正在尝试了解这种情况下的推荐模式。这是一个非常有趣的问题(对我来说) 在我看来,所有的验证代码都应该移到模型代码中。这是不违反

在Django项目中,将输入验证与模型级验证分开是典型的做法吗?例如,验证用户名是否符合命名标准将是输入验证,验证用户不在数据库中将是模型级验证

我一直在看一位同事的代码,他们将这两种类型的验证都放在一个表单类中(在forms.py中)。这是典型的设置,还是模型级验证更常见地出现在模型或视图中


或者有没有更好的方法来实现这一点——比如使用
模型形式
?我是Django的新手,正在尝试了解这种情况下的推荐模式。

这是一个非常有趣的问题(对我来说)

在我看来,所有的验证代码都应该移到模型代码中。这是不违反商业规则的方法。当验证代码在模型中时,不可能忘记新表单中的某些验证,也不可能在多个表单中有不一致的规则

我将链接到与您的问题相关的问题。在下面的问题中,您可以看到如何将代码验证从表单移动到模型。我希望这篇简短的介绍能对你有所帮助


你来自什么样的框架?验证规则是如何在您的环境中编写的?

我不同意公认的答案。我更喜欢使用模型级验证来避免模型中的不一致,并使用表单级验证来解决任何特定于站点的限制

假设我们有一个事件模型,开始时间和结束时间都有
datetime
字段。模型验证将迫使我们在开始时间之后有一个结束时间。但是,我会将其保留在表单中,以验证新创建的事件是否在过去。因此,如果我必须添加过去发生的事件,我可以使用特定于管理员的表单,允许日期在过去,或者直接将其添加到数据库中


因此,模型验证应该只检查明显错误的值。但是,如果您需要做一些时髦的事情(例如,机器人用户名中的Unicode字符),它应该允许您这样做,即使只是通过admin或shell。我读过一篇关于StackOverflow的回答,其中建议始终在后端代码中使用表单,用
表单[“field”]=“value”
之类的代码填充字段,以便从一致性验证中获益。

我同意。大多数事情实际上可以被认为是“模型级”验证。如果用户名与命名条件不匹配,您真的不希望它进入数据库。有些东西会因表单而异,这就是您希望在表单本身上验证的地方。您可能有一个奇特的文件模型,它在字段中保存文件类型。在模型级别,任何类型都可以,但在照片上载表单中,您希望将其限制为png和jpeg。例如,在您的示例场景中,您可以在
事件
表中设置userId字段,并允许为某些组用户使用过去的日期填充表单。对于您发布的每个示例,我都可以找到这样的反例;)但这是我的方法,我相信表单验证将是最好的解决方案。当然,您也可以在模型中实现它,但随后您将在功能上烘焙成应该是表单的东西。如果你想在其他地方重复使用你的博客模型,为什么它要关心文章是否属于名为“admin”的组中的用户?由于此要求可以从一个站点更改到另一个站点,因此最好将其留给表单,而不是模型本身。也许将来,您的web应用程序将具有完整的rest api。这只是一个例子。谢谢分享你的社区,欢迎。