将 <optgroup> 与 form.fields.queryset 一起使用?

Posted

技术标签:

【中文标题】将 <optgroup> 与 form.fields.queryset 一起使用?【英文标题】:Use <optgroup> with form.fields.queryset? 【发布时间】:2010-12-27 20:06:38 【问题描述】:

是否可以设置表单的 ForeignKey 字段的查询集,以便它采用单独的查询集并将它们输出到 &lt;optgroup&gt;'s 中?

这是我所拥有的:

views.py

form = TemplateFormBasic(initial='template': digest.template.id)
form.fields['template'].queryset = Template.objects.filter(Q(default=1) | Q(user=request.user)).order_by('name')

在我的模板模型中,我有默认模板和用户创建的模板。我希望它们在 &lt;select&gt; 框中明显分开,例如。

<select>
  <optgroup label="Default Templates">
    <option>Default 1</option>
    <option>Default 2</option>
  </optgroup>
  <optgroup label="User Templates">
    <option>User Template 1</option>
    <option>User Template 2</option>
  </optgroup>
</select>

这个可以吗?

【问题讨论】:

【参考方案1】:

我能够使用this blog 上给出的示例来解决这个问题

views.py

form.fields['template'].choices = templates_as_choices(request)

def templates_as_choices(request):
    templates = []
    default = []
    user = []
    for template in Template.objects.filter(default=1).order_by('name'):
        default.append([template.id, template.name])

    for template in Template.objects.filter(user=request.user).order_by('name'):
        user.append([template.id, template.name])

    templates.append(['Default Templates', default])
    templates.append(['User Templates', user])

    return templates

【讨论】:

不错!正是博士的命令!我正在寻找一种将 form.fields['field'].queryset 操作为自定义的方法,而 .choices 完全让我忘记了。太好了!【参考方案2】:

过去我没有在表单上使用外键,而是使用charfield with choices。

带有选项的 CharField 支持 optgroup。您需要有以下格式的选择:

('Group 1',(('1','Yada'),('2','Yada'))), ('Group 2',(('3','Bepety'),( '4','Bopity')))

Choices 也可以是可调用的。所以我创建了自己的函数来遍历模型并构建一个像上面这样的元组。

【讨论】:

以上是关于将 <optgroup> 与 form.fields.queryset 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

表单<form>

JSON/Ajax 格式请求上的 Select2 optgroup 组

表单标签(form)

在角度为4的选择框中处理optgroup

带有 optgroup 和图像的 Jquery select2 json 数据

cakephp form helper(select)optgroup嵌套选项数组问题