【问题标题】:Add an "empty" option to a ChoiceField based on model datas根据模型数据向 ChoiceField 添加“空”选项
【发布时间】:2009-09-16 09:34:08
【问题描述】:

我正在根据模型的数据定义一个 ChoiceField。

field = forms.ChoiceField(choices=[[r.id, r.name] for r in Model.objects.all()])

但是,我想在我的选项前面加上一个空选项来选择“否”对象。 但我找不到一个很好的方法来添加它。

我所有的测试都像:

field = forms.ChoiceField(choices=[[0, '----------']].extend([[r.id, r.name] for r in Model.objects.all()]))

返回“NoneType object not iterable”错误。 到目前为止,我发现的唯一方法如下:

def append_empty(choices):
    ret = [[0, '----------']]
    for c in choices:
        ret.append(c)
   return ret

当我定义我的领域时:

forms.ChoiceField(choices=append_empty([[r.id, r.name] for r in
    Restaurant.objects.all()]), required=False)

但是我想保持我的代码干净,不要有那种恐怖。 你能给我一个主意吗? :p 提前致谢。

【问题讨论】:

    标签: python django forms choicefield


    【解决方案1】:

    一个简单的答案是:

    field = forms.ChoiceField(choices=[[0, '----------']] + [[r.id, r.name] for r in Model.objects.all()])
    

    很遗憾,您的方法存在缺陷。即使使用您的“工作”方法,字段选择也是在定义表单时定义的,而不是在实例化时定义的 - 因此,如果您将元素添加到模型表中,它们将不会出现在选择列表中。

    您可以通过在表单的__init__ 方法中进行分配来避免这种情况。

    但是,有一种更简单的方法。与其动态地处理字段选择,不如使用专门设计用于提供模型选择的字段 - ModelChoiceField。这不仅在实例化时动态获取模型元素列表,而且默认情况下已经包含一个空白选项。见the documentation

    【讨论】:

      【解决方案2】:

      由于这个问题及其答案几乎解决了我刚刚遇到的问题,所以我想补充一点。对我来说,id 必须为空,因为模型没有将“0”识别为有效选项,但它接受了空(null=True,blank=True)。在初始化器中:

      self.fields['option_field'].choices = [
          ('', '------')] + [[r.id, r.name] for r in Model.objects.all()] 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-08
        • 2020-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多