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
как сделать так, чтобы сохранить валидацию по умолчанию и добавить мою дополнительную валидацию
без функции:
Есть ли у вас решение? Без определения новой формы
Спасибо
Попробуйте определить свой чистый метод таким образом:
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
, что делает эту проблему несуществующей.