【问题标题】:On a django form, how do I loop through individual options per field?在 django 表单上,如何遍历每个字段的各个选项?
【发布时间】:2011-11-12 17:44:13
【问题描述】:

我正在构建一个表单向导。第一步,我有一个包含一个字段的表单。该字段是外键。 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,我找到了一些可行但非常复杂的解决方案。一定有更简单的方法吧?

【问题讨论】:

    标签: python django forms


    【解决方案1】:

    您可以访问选择查询集,但请注意,模板可能不适合这种逻辑。注意field.field 这不是错字

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

    【讨论】:

    • 这确实回答了问题,你是对的;模板不是该逻辑的地方。谢谢:)
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      我可以看到这是通过两种方式完成的。

      您可以为此字段创建一个自定义小部件,以呈现每个选项模型属性。这很有可能,但我现在没有时间把它全部写出来。

      另一种更快的方法是在表单中添加一个函数来处理这个问题,并返回你想要的数据

      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__,但这可能会变得太老套了。不知道你在这里完全处理的是什么:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-11-19
        • 2017-10-13
        • 1970-01-01
        • 1970-01-01
        • 2023-03-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多