首页 > 解决方案 > Django表单如何在循环中动态呈现字段

问题描述

假设我有一个包含一些字段的表单。其中一些字段是测量单位:

['quantity_units', 'weight_units', 'dimension_units']

我也有这些领域:

['quantity', 'weight', 'dimension']

我想在字段旁边显示测量单位:

Quantity: ___________________  _______<unit of measurement drop-down list>______

我想我应该首先遍历表单的字段。对于表单字段的每次迭代,我会检查字段名称是否在units_list中,如果是,那么我将呈现该字段及其单位字段,如下所示:

{% for field in form %}
    {% for field_name in units_fields %}

        {% if field.name in field_name %}
            {{ field|add_class:"site-form-control" }} {{ form.field_name}}
        {% else %}
            {% ifchanged %}                     
                {{ field|add_class:"site-form-control" }}
            {% endifchanged %}
        {% endif %}

    {% endfor %}
{% endfor %}

这不会使用下拉列表小部件呈现测量单位字段。

任何想法如何解决这一问题?

编辑:我注意到由于某种原因,Django 显示了{{ field }}两次并且没有显示{{ form.field_name }}. 为了手动选择字段,我编写了一个模板过滤器来获取给定字典键的值。然后,我在 {{ form.fields }} 这是一个orderedDict

                            {% for field_name in units_fields %}

                                {% if field.name in field_name %}


                                    {{ form.fields|dict_key:field_name }}

                                {% else %}

                                    {% ifchanged %}

                                        {{ field|add_class:"site-form-control" }}
                                    {% endifchanged %}
                                {% endif %}

                            {% endfor %}

这呈现了我想要的字段的文本表示:

<django.forms.fields.ChoiceField object at 0x000001E5F35F3C18>

将此文本转换为实际字段的任何帮助表示赞赏

标签: djangodjango-forms

解决方案


我解决这个问题的方法是编写一个简单的标签,它返回一个 boundfield 对象<django.forms.boundfield.BoundField object at 0x0000025而不是<django.forms.fields.ChoiceField object at 0x000001E5F35F3C18>

@register.simple_tag(takes_context=True)
def get_form_field(context, form, field_name):
    ''' Given a form and a field_name, it returns form.field'''
    try:
        field = form[field_name]
    except KeyError:
        field = None

    return field

推荐阅读