验证文本字段和数字

Posted

技术标签:

【中文标题】验证文本字段和数字【英文标题】:validate text field and number 【发布时间】:2013-05-10 22:29:59 【问题描述】:

forms.py

class PhoneinfoForm(forms.ModelForm):

    pname = forms.CharField(required=True)
    pnumber = forms.IntegerField(required=True)
    gname = forms.CharField(required=False)
    gnumber = forms.IntegerField(required=False)
    class Meta:
        model = Phone_info
        fields = ['pname','pnumber','gname','gnumber']

    def clean(self):
        cleaned_data = self.cleaned_data
        pname = cleaned_data.get("pname")
        pnumber = cleaned_data.get("pnumber")
        gname = cleaned_data.get("gname")
        gnumber = cleaned_data.get("gnumber")

        if 'pname' and 'pnumber' not in cleaned_data: 
            raise forms.ValidationError
        if 'gname' and 'gnumber' not in cleaned_data: 
            raise forms.ValidationError

        return cleaned_data

我正在尝试验证姓名和号码。就我而言,pnamepnumber 是一组必填字段,我实现了我的奉献 required=True

第二件事是gnamegnumber 不是强制性的,但是如果输入了gnumber,那么gname 将变为空白(如果在gname 中没有输入任何内容,则它会接受)这不应该发生。如果输入了数字,它不应该接受没有名称,反之亦然。

我的代码不适用于第二选择,如何验证。

谢谢

【问题讨论】:

你能告诉我是不是我犯了错误 【参考方案1】:

你的代码中有几个不好的地方:

1) 使用forms.ModelForm时,如果对应的模型字段具有相同的约束,则不需要在表单中声明字段。从问题示例中,如果模型Phone_info中对应的字段与表单的required具有相同的blank属性,则不需要在模型表单中再次声明字段。

2) 由于pnamepnumber 是必填项,因此您无需手动检查它们是否已填写。 ModelForm 已经完成了。所以这很奇怪,必须删除:

if 'pname' and 'pnumber' not in cleaned_data: 
    raise forms.ValidationError

3) 此行将不会按预期进行:

if 'gname' and 'gnumber' not in cleaned_data

它将首先检查条件'gnumber' not in cleaned_data。结果将是布尔值(真/假)。然后将应用条件if 'gname' and False/True

你想要的是:

gname = self.cleaned_data.get("gname", None)
gnumber = self.cleaned_data.get("gnumber", None)
if gname and gnumber is None:
    raise forms.ValidationError("gnumber must be filled")
if gnumber is not None and not gname:
    raise forms.ValidationError("gname must be filled")

4) 正如您在第 3 页中提到的,forms.ValidationError 在引发时必须初始化:

raise forms.ValidationError("Error message")

所以结果代码

class PhoneinfoForm(forms.ModelForm):

    # delete these fields, if they are the same, as in Phone_info
    pname = forms.CharField(required=True)
    pnumber = forms.IntegerField(required=True)
    gname = forms.CharField(required=False)
    gnumber = forms.IntegerField(required=False)

    class Meta:
        model = Phone_info
        fields = ['pname', 'pnumber', 'gname', 'gnumber']

    def clean(self):
        gname = self.cleaned_data.get("gname", None)
        gnumber = self.cleaned_data.get("gnumber", None)
        if gname and gnumber is None:
            raise forms.ValidationError("gnumber must be filled")
        if gnumber is not None and not gname:
            raise forms.ValidationError("gname must be filled")

        return self.cleaned_data

【讨论】:

你对答案的解释很好理解..谢谢stalk 不客气。更新以覆盖大小写,当 gnumber 输入为 0 时。最好在这种情况下检查 gnumber is None

以上是关于验证文本字段和数字的主要内容,如果未能解决你的问题,请参考以下文章

根据复选框条件验证输入文本字段(最大值和最小值)

v文本字段中的多重验证规则

编辑电子邮件的文本字段不验证电子邮件地址?

在字段纯PHP退出时验证输入字段

使用 11 检查荷兰 BSN 验证文本字段

验证输入字段的特定结构