【问题标题】:Django form with choice field not providing None as a choice带有选择字段的 Django 表单不提供 None 作为选择
【发布时间】:2013-03-26 22:37:38
【问题描述】:

我有一个选择字段,其格式定义为

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 值被强制转换为字符串。在选择字段中完成默认提示并要求该字段的最佳方法是什么?

【问题讨论】:

  • 所有 POST 和 GET 变量,以及 Select HTML 标记值最初都是作为字符串发送的。当它可以从模型中扣除时,Django 将它们转换为 -say- int。在您的情况下,无法将“None”字符串与“None”对象区分开来,它们都是可能的值。您可能更喜欢在 REFERRAL_CHOICHES 中使用 "" 而不是 None
  • 很好的解释。如果您将此作为答案,我会投票并接受它,因为它有效。

标签: django django-forms


【解决方案1】:

所有POST 和GET 变量以及Select HTML 标记值最初都是作为字符串发送的。当它可以从模型中扣除时,Django 将它们转换为 -say- int。在您的情况下,无法将“None”字符串与“None”对象区分开来,它们都是可能的值。您可能更喜欢在 REFERRAL_CHOICHES 中使用 "" 而不是 None

【讨论】:

  • 虽然你是绝对正确的,但这感觉就像 Django 中的一个错误。在后端,我们发送一个 None,我们可以期望将它作为 None 接收回来,而不是 'None'...
猜你喜欢
  • 1970-01-01
  • 2015-11-04
  • 2018-06-02
  • 1970-01-01
  • 2015-11-08
  • 2013-04-18
  • 2014-10-29
  • 2021-09-29
  • 1970-01-01
相关资源
最近更新 更多