【问题标题】:Modelform - validation on form fieldModelform - 表单字段验证
【发布时间】:2013-08-01 22:24:30
【问题描述】:

请原谅我是 django 的新手,但我正在尝试正确验证名为:domainNm 的表单域

表格

class SubmitDomain(ModelForm):

    class Meta:
        model = Tld #Create form based off Model for Tld
        fields = ['domainNm',]

def clean_domainName(self):
    cleanedDomainName = self.cleaned_data.get('domainNm')
    if Tld.objects.filter(domainNm=cleanedDomainName).count > 1:
        errorMsg = u"Sorry that domain is not available."
        raise ValidationError(errorMsg)
    else:
        return self.cleaned_data

## This creates the form.
form = SubmitDomain()

目前,如果我输入:

abcdefghidfghiqwertyuiopasdfghjklcvbndmsja.com

或

df.com

或

df.com(再次)

两者都是有效的,但它们不应该是。

它不检查域是否已经存在(如form 中所述) - 它应该在其中

我也没有收到任何错误。

知道我做错了什么吗?

【问题讨论】:

    标签: django forms django-forms


    【解决方案1】:

    我发现这里有几个问题。

    一,您的clean 方法与字段名称不匹配。而不是clean_domainName,它需要被命名为clean_domainNm。至少只要那是您的模型字段名称。

    二,你的比较if Tld.objects.filter(domainNm=cleanedDomainName).count > 1:是错误的。 count 是一个方法 - 你需要调用它。

    if Tld.objects.filter(domainNm=cleanedDomainName).count() > 1:
    

    三,我认为你的逻辑是错误的。这将允许创建给定名称的第二个实例,因为count() 将返回 1,这意味着表单是有效的。我认为您想检查 count() 是否为 0,或者最好使用 exists() 代替:

    if Tld.objects.filter(domainNm=cleanedDomainName).exists():
    

    更好的是,将字段定义为unique=True。

    【讨论】:

    • 该字段的模型级属性。除了表单验证之外,还将在数据库级别强制执行。 docs.djangoproject.com/en/dev/ref/models/fields/…
    • 模型级验证的重点。我认为这是显示 tld 存在错误所必需的。 exists() 也很重要。谢谢!
    • @Alasdair 正确地指出您需要返回清理后的值,而不是 cleaned_data 字典。
    猜你喜欢
    • 2017-10-06
    • 1970-01-01
    • 2018-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多