在django表单中,如何遍历每个字段的各个选项?

时间:2011-11-12 17:44:14

标签: python django forms

我正在构建表单向导。在第一步,我有一个带有一个字段的表单。该字段是外键。 Django的外键默认小部件为我提供了下拉(选择)菜单中的字段选项,并将每个选项表示为html选项。我将默认小部件更改为RadioSelect。所以现在它通过单选按钮为我提供了该字段的选项。

这是我的forms.py

class ChooseProductTypeForm(ModelForm):
    class Meta:
        model = Product
        widgets = {
            'type': RadioSelect,
        }

我想要做的是能够遍历每个选项并获取我存储在模型上的每个选项的特定数据。

我希望它会如此简单:

{% for field in form %}
    {% for option in field %}
        {{ option.image }}
        {{ option.title }}
        {{ option.description }}
    {% endfor %}
{% endfor %}

经过一天半的研究,我决定看看社区有什么话要说。 FWIW,我发现了一些可行但非常复杂的解决方案。必须有一个更简单的方法,不是吗?

3 个答案:

答案 0 :(得分:7)

您可以访问选择查询集,但请注意,模板可能不适合此类逻辑。注意field.field不是拼写错误

{% for field in form %}
    {% for option in field.field.choices.queryset %}
        {{ option.image }}
        {{ option.title }}
        {{ option.description }}
    {% endfor %}
{% endfor %}

答案 1 :(得分:0)

很抱歉,但是字段不能以您希望的方式进行迭代。您尝试迭代的事情不是查询集;这是一个ModelChoiceField。您可以访问各个选项,但它们在内部表示为两元组,其中外键的ID为第一个元素,__unicode__表示为第二个元素。

正如你所说,但有办法解决这个问题。最好的方法,即使它有点难看,也许可以使用模型ID作为键向下发送包含所需信息的字典。您可以使用values queryset轻松完成此操作。

答案 2 :(得分:0)

我可以通过两种方式看到这一点。

您可以为此字段创建自定义窗口小部件,以呈现每个选项模型属性。这很有可能,但我现在没有时间全力以赴。

另一种更快捷的方法是在表单中添加一个处理此功能的函数,并返回所需的数据

class ChooseProductTypeForm(ModelForm):
    def get_my_modelfield(self):
        for option in self.fields['my_modelfield'].queryset:
            yield {
              'image': option.image, 
              'title': option.title, 
              'description': option.description
           }

这主要使数据库不在模板之外,只需使用易于理解的表单函数来返回所需的数据。如果表单字段发生变化,则不再是散布调整模板,而只是更新此函数。

这样做的缺点是你不能简单地遍历表单中的字段,你必须明确输出每一个字段。当然,您也可以在表单上使用__iter__,但这可能会变得过于苛刻。不确定你在这里完全处理的是什么:)