【发布时间】: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