2013-03-26 3 views
1

У меня есть поле выбора в форме, определяемой какДжанго формы с полем выбора не обеспечивает None как выбор

REFERRAL_CHOICES = (
    (None, 'Please choose'), 
    ('search', 'From a search engine'), 
    ('social', 'From a social network'), 
) 
referral_source = forms.ChoiceField(
    choices=REFERRAL_CHOICES 
) 

У меня также есть clean_company_size функцию, которая проверяет, если поле установлено хорошее значение:

def clean_company_size(self): 
    company_size = self.cleaned_data.get('company_size', None) 
    if company_size is None: 
     raise ValidationError('Please select a company size') 

    return company_size 

Если я добавлю условие or company_size == 'None' к вышеуказанному Нет проверки, все работает хорошо. Однако мне любопытно, почему значение None передается в строку. Каков наилучший способ выполнить подсказки по умолчанию в поле выбора и иметь это поле?

+2

Все переменные POST и GET, а также теги Select HTML, изначально отправляются в виде строк. Django преобразует их в -say-int, когда он вычитается из модели. В вашем случае невозможно отличить строку «Нет» от объекта «Нет», это оба возможных значения. Вы можете предпочесть использовать «" вместо None в вашем REFERRAL_CHOICHES – furins

+0

Отличное объяснение. Если вы ответите на этот вопрос, я проголосую за него и приму его, поскольку он работает. –

+0

Спасибо :) вот это – furins

ответ

1

Все POST и GET переменные, а также Select Значения HTML-тега изначально отправляются как строки. Django преобразует их в -say- int, когда он вычитается из модели. В вашем случае невозможно отличить строку «Нет» от объекта «Нет», это оба возможных значения. Вы можете использовать «» вместо None в своем REFERRAL_CHOICHES

+1

Хотя вы абсолютно правы, это похоже на ошибку в Django. В бэкэнде мы отправляем None, мы можем ожидать получить его обратно как None, а не «None» ... –

Смежные вопросы