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, а затем отображать его вручную в шаблоне в качестве выбора с вашими вариантами. Таким образом, он может принимать все, не требуя специального валидатора