代码之家  ›  专栏  ›  技术社区  ›  Damien MATHIEU

根据模型数据向选项字段添加“空”选项

  •  2
  • Damien MATHIEU  · 技术社区  · 15 年前

    我正在根据模型的数据定义一个选项字段。

    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 预先谢谢。

    2 回复  |  直到 7 年前
        1
  •  8
  •   Daniel Roseman    15 年前

    一个简单的答案是:

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

    不幸的是,你的方法有缺陷。即使使用“工作”方法,也会在定义窗体时定义字段选项,而不是在实例化窗体时定义字段选项-因此,如果将元素添加到模型表中,它们将不会显示在选项列表中。

    您可以通过在 __init__ 形式的方法。

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

        2
  •  0
  •   r-mean    7 年前

    因为这个问题及其答案几乎解决了一个问题,所以我想添加一些东西。对于我来说,ID必须为空,因为模型没有将“0”识别为有效选项,但它接受为空(空=真,空=真)。在初始值设定项中:

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