根据模型数据向ChoiceField添加"空"选项

Dam*_*IEU 2 python forms django choicefield

我正在根据模型的数据定义ChoiceField.

field = forms.ChoiceField(choices=[[r.id, r.name] for r in Model.objects.all()])
Run Code Online (Sandbox Code Playgroud)

但是我想用空的选项前置我的选项以选择"否"对象.但我找不到一个好的方法来预先设置.

我所有的测试都像:

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

返回"无类型对象不可迭代"错误.我到目前为止找到的唯一方法如下:

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

当我定义我的领域时:

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

但是,我想保持我的代码干净,没有那种恐怖.你有想法吗?:p谢谢你提前.

Dan*_*man 8

一个简单的答案是:

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

不幸的是,你的方法存在缺陷.即使使用"工作"方法,字段选择也是在定义表单时定义的,而不是在实例化时定义的 - 因此,如果向Model表中添加元素,它们将不会出现在选项列表中.

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

但是,有一种更容易的方法.您应该使用专门设计用于提供模型选择的字段,而不是动态地弄乱字段选择ModelChoiceField.这不仅在实例化时动态获取模型元素列表,默认情况下它还包含一个空白选项.请参阅文档.