Я пытаюсь установить простую форму, чтобы пользователь мог ввести IP-подсеть в мое приложение django. Я хочу проверить, что IP + Mask является адресом подсети.
Я использую CreateView с IpRangeForm. Тем не менее, я заметил проблему: когда я перезаписываю метод очистки ModelForm, моя проверка модели не работает.
Модель:
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"
ModelForm:
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
Если я удаляю свой чистый метод, проверка модели работает нормально. С моим чистым методом работает только проверка подсети, поэтому пользователь может ввести, например, символы в поле IP.
Я не вижу разницы, если я добавляю или удаляю вызов родителю:
super(IpSubnetForm, self).clean()
Поэтому, похоже, в моем случае я должен использовать другой способ?
Как я могу это исправить, какую ошибку я делаю?