【问题标题】:Model validating in django when using CreateView/ModelForm with custom clean method使用带有自定义清理方法的 CreateView/ModelForm 时在 django 中进行模型验证
【发布时间】:2019-08-22 01:34:21
【问题描述】:

我正在尝试设置一个简单的表单,以便用户将 IP 子网输入到我的 django 应用程序中。我想验证 IP + Mask 是子网地址。 我将 CreateView 与 IpRangeForm 一起使用。但是,我注意到一个问题,即当我覆盖 ModelForm clean 方法时,我的模型验证不起作用。

型号:

class IpSubnet(models.Model):
    ip = models.GenericIPAddressField(verbose_name="IP", protocol='IPv4')    
    mask = models.IntegerField(verbose_name="Mask", default=24, validators=[MaxValueValidator(32), MinValueValidator(0)]))

查看:

class IpSubnetCreateView(SuccessMessageMixin, CreateView):
    form_class = IpSubnetForm 
    model = IpSubnet   
    success_url = '/front/'
    success_message = "%(ip)s/%(mask)s added"

模型形式:

class IpSubnetForm(forms.ModelForm):
    class Meta:
        model= IpSubnet
        fields = ( 'ip','mask')

    def clean(self):
        cleaned_data = super(IpSubnetForm, self).clean()
        ip = cleaned_data.get('ip')
        mask = cleaned_data.get('mask')

        subnet = ipcalc.Network(ip + "/" + str(mask))
        if ip != subnet.network():
            raise ValidationError(
                _('%(ip)s/%(mask)s is not a network address (network address: %(network)s/%(mask)s)'),
                params={'ip':str(ip), 'mask' : str(mask), 'network':str(subnet.network())},
            )
        return cleaned_data

如果我删除我的 clean 方法,模型验证就可以正常工作。使用我的干净方法,只有子网验证有效,因此用户可以在 IP 字段中输入即字符。 如果我添加或删除对父级的调用,我看不出有任何区别:

super(IpSubnetForm, self).clean()

因此,在我的情况下,我应该使用其他方式?

我该如何解决,我犯了什么错误?

【问题讨论】:

    标签: python django validation


    【解决方案1】:

    因此,在对 django 中的验证如何工作进行了更多调查之后,感谢this 的回答,这就是解决方案:

    def clean(self):      
        cleaned_data = super(IpRangeForm, self).clean()
    
        if any(self.errors):
            return self.errors
    

    问题是验证确实运行了,但它并没有停止运行清理方法。因此它引发了一个例外,关于我尝试使用 NoneType。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-23
      • 1970-01-01
      • 1970-01-01
      • 2010-12-28
      • 2016-07-01
      • 2012-11-03
      • 2021-05-02
      • 2012-05-06
      相关资源
      最近更新 更多