Django形成了如何在循环中动态呈现字段的方法

时间:2019-02-27 17:53:18

标签: django django-forms

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

['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>

感谢您提供任何帮助将文本转换为实际字段的帮助

1 个答案:

答案 0 :(得分:0)

我解决此问题的方法是编写一个simple tag来返回边界域对象<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