Django Form使用嵌套(optgroup)<select>显示来自其他两个表的相关数据

时间:2018-05-09 12:35:34

标签: django forms

我正在尝试复制此手动创建的&lt; select&gt;的功能使用适当的Django表单。 {%regroup roll_counts by get_type_display as roll_list%} &lt; select name =“film”&gt;     &lt; option&gt;选择一部电影&lt; / option&gt;     {%表示roll_list%}     &lt; optgroup label =“{{type.grouper}}”&gt;         {%for type in type.list%}         &lt; option value =“{{film.id}}”&gt; {{film.manufacturer}} {{film.name}}({{film.count}})&lt; / option&gt;         {%endfor%}     &LT; / OPTGROUP&GT;     {%endfor%} &LT; /选择&GT; roll_counts的查询集如下所示: roll_counts = Film.objects \     .filter(roll__owner = owner,roll__status ='storage')\     .filter(格式= camera.format)\     .annotate(计数=计数( '姓名'))\     .order_by( '类型') 我正在尝试使用某种Django ModelForm重新创建它,以便能够实际验证提交给表单的数据。最终目标是能够用一卷胶卷“装载”相机。也就是说:将一个Roll(带有外键到Film)与一个特定的Camera相关联,并将所述相机标记为已加载状态。所以&lt; select&gt;显示表单未更新的数据。需要修改的是Roll和Camera模型,而不是Film模型。但我假设所有可以在从表单接收数据的视图中处理。 我不确定如何让ModelForm显示上述roll_count查询(和嵌套/ optgroup&lt; select&gt;),因为它与该Film模型上的单个字段无关。 关于如何进行的任何想法? 更新: 接受的答案解决了拼图的嵌套部分,但另一部分是从视图传递到表单的数据和字段工作的QuerySet。 在视图中,您可以将任何想要的内容传递给表单实例: form = LoadCameraForm(owner = owner,format = camera.format) 在表单中,我添加了一个自定义__init__(注意所有者,* args和** kwargs之间的格式): def __init __(self,* args,owner,format,** kwargs):     super().__ init __(* args,** kwargs)     self.fields ['roll_counts']。queryset = Film.objects \         .filter(roll__owner = owner,roll__status ='storage')\         .filter(格式=格式)\         .annotate(计数=计数( '姓名'))\         .order_by( '类型') (我仍然不确定如何让我的注释计数出现。) 然后将所有部分放在一起,表单中的字段条目如下所示: roll_counts = GroupedModelChoiceField(\     label ='选择要加载的电影',\     查询集=无,\     group_by_field = '类型')

2 个答案:

答案 0 :(得分:1)

没有内置的表单字段可以执行您想要的操作,因此您必须创建自己的自定义字段和窗口小部件,以便将字段呈现为HTML。看一下django.forms.fields模块,您将看到如何定义表单字段。虽然对某些人来说,做到正确可能是一个挑战。

说实话,我建议您搜索另一个显示表单的选项。您可以为type选择一个字段,选中后,您可以使用ajax加载film的选项吗?

我的2美分:)

答案 1 :(得分:1)

我做过一次!请参阅我的代码段:) https://djangosnippets.org/snippets/10573/