【问题标题】:Help with validation in Models and Forms帮助在模型和表单中进行验证
【发布时间】:2011-07-01 10:23:36
【问题描述】:

我有几个关于模型和表单验证的问题。你能帮我解决这些问题吗:


应该在哪里进行验证?它应该在模型还是表单中?解决这个问题的正确方法是在表单中使用验证器并在模式中使用约束吗?


在表单中编写“clean_”方法和编写验证器有什么区别?我看到人们经常将验证检查放在 'clean_' 方法中。


在我正在处理的请求中,我在 URL 字符串中有一个名为“alive”的参数。这通常是 1 或 0。在我的表单中定义它的正确方法是什么?我需要验证它是一个数字,并且只能是 1 或 0。这是正确的方法吗?

alive = models.IntegerField(null=False, max_value=1, min_value=0)

我如何为这个字段定义一个默认值,即如果这个参数没有传递,我默认为0(假)。

我在客户端没有表单。我正在使用 Django 表单来验证我的 JS POST 请求。


在其中一个模型字段中,我需要以 1234x4321 格式存储屏幕分辨率。我是否应该将此声明为CharField 模型和表单中添加一些正则表达式验证?任何正则表达式验证示例都会有所帮助。


谢谢。

【问题讨论】:

    标签: python django django-models django-forms django-validation


    【解决方案1】:

    验证应该在表单上完成,而不是在模型上。但是,如果您使用 ModelForms,这通常很有意义,它会从模型本身继承一些验证规则(那些特定于数据库的验证规则,如最大字段长度、数据库字段类型,以及它们是否可以留空)。

    字段的默认值应与其构造函数一起传递:

    form = SomeForm(initial={'alive' : 0})
    

    尽管在您的情况下,如果可以获得的值只有零和一,那么使用 BooleanField 代替是有意义的(在这种情况下,它将默认为 false)。

    在分辨率的情况下,我会在可能的分辨率和任意值之间创建一个映射。

    RESOLUTIONS = (                                                
            ("1","800x600"),
            ("2","1024x768"),                            
             .....                        
    )   
    

    然后将其传递给模型:

    resolutions = models.CharField(RESOLUTIONS, max_length=1)
    

    这样用户就可以得到一个带有相应选项和值的选择字段。 另一方面,如果您需要用户自己插入,使用两个字段(一个用于宽度,另一个用于高度)将比验证用户输入容易得多。

    所以你可以为模型定义一个方法:

    def get_resolution(self):
        return "%sx%s" % (self.width, self.height)
    

    【讨论】:

    • 嗨 Uku,我想以 XXXxXXXX 格式存储分辨率,因为在我们的例子中我们有很多组合。你能告诉我我需要什么样的验证和约束来实现这个吗?谢谢。
    • 好吧,不用太复杂,把它们保存在不同的字段中,一个是高度,一个是宽度。
    • 嘿 Uku,你是对的。另一件事:我有一个 Django 应用程序,它接受一个 JS 请求并将数据存储到一堆模型中。没有发布此内容的客户表格。是 JS 在幕后计算东西并发出请求。什么是可取的 - 为整个请求创建一个表单,覆盖表单的保存方法并添加逻辑以将数据保存到相应的模型目录 - 或 - 为需要数据的每个模型创建单独的 ModelForms得救了吗?
    猜你喜欢
    • 2023-03-22
    • 1970-01-01
    • 2021-02-26
    • 1970-01-01
    • 2010-11-28
    • 2010-11-01
    • 2016-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多