2013-03-26 68 views
1

我在定义为Django的形式与选择字段不提供无作为选择

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

中使用“”代替None所有POST和GET变量以及选择HTML标记值最初都以字符串形式发送。 Django将它们转换为-say-int时,它可以从模型中扣除。在你的情况下,无法将“无”字符串与“无”对象区分开来,它们都是可能的值。你可能更喜欢在你的REFERRAL_CHOICHES – furins 2013-03-26 22:43:38

+0

中使用“”而不是None。如果你做出这个答案,我会对它进行投票并接受它,因为它是有效的。 – 2013-03-26 22:44:38

+0

谢谢:)在这里它是 – furins 2013-03-26 22:53:28

回答

1

全部POSTGET变量以及Select HTML标记值最初作为字符串发送。当Django从模型中扣除时,它们将它们转换为-say- int。在你的情况下,无法将“无”字符串与“无”对象区分开来,它们都是可能的值。您可能更愿意在您的REFERRAL_CHOICHES

+1

虽然你是绝对正确的,但这感觉就像是Django中的一个bug。在后端,我们发送一个无,我们可以期望收到它作为无,而不是'无'... – 2015-10-26 18:33:37