Django forms.ChoiceField без проверки выбранного значения
Django ChoiceField "Проверяет, что данное значение существует в списке вариантов."
Я хочу ChoiceField (чтобы я мог вводить варианты в представлении), но я не хочу, чтобы Django проверял, есть ли выбор в списке вариантов. Это сложно объяснить, почему, но это то, что мне нужно. Как это будет достигнуто?
Ответы
Ответ 1
Вы можете создать пользовательский ChoiceField
и переопределить, чтобы пропустить проверку:
class ChoiceFieldNoValidation(ChoiceField):
def validate(self, value):
pass
Я хотел бы знать ваш случай использования, потому что я действительно не могу придумать, почему вы нуждаетесь в этом.
Изменить: проверить, сделать форму:
class TestForm(forms.Form):
choice = ChoiceFieldNoValidation(choices=[('one', 'One'), ('two', 'Two')])
Предоставить "недействительные" данные и посмотреть, сохраняется ли форма:
form = TestForm({'choice': 'not-a-valid-choice'})
form.is_valid() # True
Ответ 2
Лучший способ сделать это из внешнего вида: создать forms.Charfield
и использовать виджет forms.Select
. Вот пример:
from django import forms
class PurchaserChoiceForm(forms.ModelForm):
floor = forms.CharField(required=False, widget=forms.Select(choices=[]))
class Meta:
model = PurchaserChoice
fields = ['model', ]
По какой-то причине переписывание только валидатора не помогло мне.
Ответ 3
В качестве другого варианта вы можете написать свой собственный validator
from django.core.exceptions import ValidationError
def validate_all_choices(value):
# here have your custom logic
pass
а затем в вашей форме
class MyForm(forms.Form):
my_field = forms.ChoiceField(validators=[validate_all_choices])
Изменить: другой параметр может определять поле как CharField
, а затем отображать его вручную в шаблоне в качестве выбора с вашими вариантами. Таким образом, он может принимать все, не требуя специального валидатора