Размещение ошибки валидации для редактируемого поля со списком
Я включил редактирование списка в одном из моих админов django, чтобы позволить пользователю обновлять минимальное и максимальное значение. Я установил валидацию, чтобы убедиться, что min не больше max. Проверка работает, как и ожидалось. Однако я не очень доволен тем, как отображается сообщение.
В настоящее время, как видно на скриншоте, сообщение об ошибке появляется прямо над полем, что нарушает выравнивание таблицы. Столбец с ошибкой становится шире остальных и даже не выделяется красным цветом.
Вместо этого я пытаюсь показать ошибку в верхней части страницы, как
Please correct the errors below.
Min value cannot be greater than max value
....
и просто выделите ошибочное поле красной рамкой.
как лучше всего этого добиться?
Я попытался переопределить функцию is_valid
в своей CustomModelForm
, но не могу добавить туда сообщения, так как у меня нет доступа к объекту request
. Все, что я пытался передать объекту запроса, было тщетно.
class CustomModelForm(forms.ModelForm):
class Meta:
model = MyModel
fields = '__all__'
def is_valid(self):
if 'min_quantity' in self._errors:
# messages.error(self.request, self._errors["min_quantity"])
print("Handling a specific validation error for 'min'")
del self._errors['min_quantity']
super().is_valid()
После того, как я смогу установить сообщения django, какой шаблон я должен расширить, чтобы настроить подсветку ошибочного поля?
Если не это, то как еще можно отобразить ошибку, чтобы она была более удобной для глаз.
Вместо того чтобы пытаться управлять обработкой ошибок в методе is_valid() напрямую, рассмотрите возможность настройки проверки в методе clean() формы, где вы можете добавить свою проверку и обрабатывать ошибки более чисто.
Пример:
from django import forms
from django.core.exceptions import ValidationError
class CustomModelForm(forms.ModelForm):
class Meta:
model = MyModel
fields = '__all__'
def clean(self):
cleaned_data = super().clean()
min_value = cleaned_data.get('min_value')
max_value = cleaned_data.get('max_value')
if min_value is not None and max_value is not None:
if min_value > max_value:
self.add_error('min_value', 'Min value cannot be greater than max value.')
self.add_error('max_value', 'Max value must be greater than min value.')
return cleaned_data