Django admin Valid form with funtion clean

В моей модели django я определил чистую функцию для проверки дополнительных условий перед сохранением данных.

Вот моя модель:

class TestRange(models.Model):
    SERVICE = [
        ('s1', 'Service 1'),
        ('s2', 'Service 2')
    ]

    service = models.CharField(max_length=2, choices=SERVICE)
    SDA = [
        (False, 'NO SDA'),
        (True, 'SDA')
    ]
    sda = models.BooleanField(choices=SDA)
    number_start = models.CharField(max_length=10, validators=[valide_phone_number])
    number_end = models.CharField(max_length=10, validators=[valide_phone_number])

    def clean(self):
        if int(self.number_end) < int(self.number_start):
            raise ValidationError({'number_end': _("The end number must be greater than or equal to the start number")})
        if self.sda and len(self.number_start)!=10:
            raise ValidationError({'number_start': _("A SDA number consists of 10 digits")})
        super(TestRange, self).clean()

После определения этой функции валидация по умолчанию в форме администратора больше не работает, мне больше не нужно проверять поля формы перед регистрацией.

У меня появилось сообщение об ошибке:

invalid literal for int() with base 10: ''

Request Method:     POST
Request URL:    http://127.0.0.1:8000/admin/gestnum/testrange/add/
Django Version:     4.1
Exception Type:     ValueError
Exception Value:    

invalid literal for int() with base 10: ''

Exception Location:     C:\Users\user\Documents\DEV\test\test\models\TestRange.py, line 25, in clean
Raised during:  django.contrib.admin.options.add_view
Python Executable:  C:\Users\user\Documents\DEV\test\.venv\Scripts\python.exe
Python Version:     3.9.6

как сделать так, чтобы сохранить валидацию по умолчанию и добавить мою дополнительную валидацию

без функции:

defaut validate adminform

Есть ли у вас решение? Без определения новой формы

Спасибо

Попробуйте определить свой чистый метод таким образом:

    def clean(self):
        number_start = int(self.number_start) if self.number_start.isnumeric() else 0
        number_end = int(self.number_end) if self.number_end.isnumeric() else 0
        if number_end < number_start:
            raise ValidationError({'number_end': _("The end number must be greater than or equal to the start number")})
        if self.sda and len(f'{number_start}') != 10:
            raise ValidationError({'number_start': _("A SDA number consists of 10 digits")})
        super().clean()

При вводе данных в админ-панели поля self.number_start и self.number_end, вероятно, пустые, потому что вы не заполнили их каким-либо целочисленным значением. Также я думаю, что поля number_start и number_end должны быть типа IntegerField, что делает эту проблему несуществующей.

Вернуться на верх