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谢谢你提前.
一个简单的答案是:
field = forms.ChoiceField(choices=[[0, '----------']] + [[r.id, r.name] for r in Model.objects.all()])
Run Code Online (Sandbox Code Playgroud)
不幸的是,你的方法存在缺陷.即使使用"工作"方法,字段选择也是在定义表单时定义的,而不是在实例化时定义的 - 因此,如果向Model表中添加元素,它们将不会出现在选项列表中.
您可以通过在__init__表单的方法中进行分配来避免这种情况.
但是,有一种更容易的方法.您应该使用专门设计用于提供模型选择的字段,而不是动态地弄乱字段选择ModelChoiceField.这不仅在实例化时动态获取模型元素列表,默认情况下它还包含一个空白选项.请参阅文档.
| 归档时间: |
|
| 查看次数: |
3942 次 |
| 最近记录: |