Проверка модели в django при использовании CreateView / ModelForm с пользовательским чистым методом - PullRequest
0 голосов
/ 01 апреля 2019

Я пытаюсь установить простую форму, чтобы пользователь мог ввести 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()

Поэтому, похоже, в моем случае я должен использовать другой способ?

Как я могу это исправить, какую ошибку я делаю?

1 Ответ

0 голосов
/ 11 апреля 2019

Итак, после дополнительных исследований того, как работает проверка в django, и благодаря этому ответу, это решение:

def clean(self):      
    cleaned_data = super(IpRangeForm, self).clean()

    if any(self.errors):
        return self.errors

Проблема заключалась в том, что проверка выполнялась, ноне остановился от запуска метода очистки.Поэтому возникает исключение, когда я пытаюсь работать с NoneType.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...