У меня есть форма в models.py моего Джанго проекта:Как пропустить проверку для поля Django в ModelForm с помощью Select2?
class Profile(models.Model):
choices = (("choice1", "choice1"), ("choice2", "choice2"), ("choice3", "choice3"))
field = models.CharField(choices=choices)
В forms.py:
class ProfileForm(ModelForm):
class Meta:
model = Profile
fields = ["field"]
widgets = {"field": Select2TagWidget}
Я использую Select2TagWidget, чтобы сделать мое поле выбора выглядеть лучше, но и , теоретически, чтобы позволить пользователю вводить варианты, не входящие в первоначальный список. Интерфейс для этого отлично работает, и пользователь может ввести другие значения. Однако, когда пользователь переходит к отправке с новым значением, проверка формы django блокирует сохранение в базе данных. Поэтому моя проблема заключается в следующем:
Как сохранить тег Select2, но заставить django возвращать True при вызове is_valid(), когда единственная «ошибка» заключается в том, что пользователь ввел новое значение?
Я пробовал переписывать многие классы, но безрезультатно. Я также видел некоторые ответы, которые связаны с использованием специальных виджетов, но я не могу их использовать, потому что мне нужно использовать виджет Select2.
EDIT:
Вот код проверки Джанго внутри класса Field, который является трудным для меня (в частности, цикл):
def validate(self, value, model_instance):
"""
Validates value and throws ValidationError. Subclasses should override
this to provide validation logic.
"""
if not self.editable:
# Skip validation for non-editable fields.
return
if self.choices and value not in self.empty_values:
for option_key, option_value in self.choices:
if isinstance(option_value, (list, tuple)):
# This is an optgroup, so look inside the group for
# options.
for optgroup_key, optgroup_value in option_value:
if value == optgroup_key:
return
elif value == option_key:
return
raise exceptions.ValidationError(
self.error_messages['invalid_choice'],
code='invalid_choice',
params={'value': value},
)
if value is None and not self.null:
raise exceptions.ValidationError(self.error_messages['null'], code='null')
if not self.blank and value in self.empty_values:
raise exceptions.ValidationError(self.error_messages['blank'], code='blank')
Однако, переписав его так:
class NoValidationCharField(models.CharField):
def validate(self, value, model_instance):
return
и использование этого вместо CharField не устраняет проблему.
Ошибка Django вызвана проверкой, проверяющей, находится ли значение внутри списка вариантов. Эта проверка не имеет для меня реальной цели: она не проверяет защиту базы данных или целостность типа. Я разместил код, где он конкретно встречается в моем вопросе. – TheRuler