Django templatetag根据字段标签返回字段

时间:2012-12-08 00:09:43

标签: django django-templates

我知道字段标签(比如说“BOP”)。我想创建一个templatetag,它将返回正确的字段对象,以便我可以使用这样的形式。

{% with bop=form|f_lookup:"BOP"  %}
    <div>
        <div class="span-4">BOP</div>
        <div class="span-5">{{ bop }}</div>
    </div>
{% endwith %}

我的模板标签不起作用,我知道我必须忽略一些明显的东西......

@register.filter(name='f_lookup')
def field_lookup_by_label(form, arg):
    """Look up a form field based on a label"""
    return next((form.fields[k] for k, v in form.fields.items() if v.label == arg), None)

1 个答案:

答案 0 :(得分:2)

试试这个:

return next((fld for fld in form if fld.label == arg), None)

如果这样可行,那么原因如下。 form.fieldsField个对象的字典,它不知道如何在模板中呈现自己。只有当您调用表单的__getitem__函数时,才会将字段转换为BoundField对象,该对象知道如何将自身呈现为HTML。见https://github.com/django/django/blob/master/django/forms/forms.py的第101和412行。

当您返回form.fields元素时,您只是返回Field个子类而不是BoundField,只有BoundField个对象知道如何渲染自己在模板中。

此外,如果您没有将标签作为关键字参数传递给bop字段构造函数,我相信您的原始函数将不起作用。如果使用Field调用构造函数,None对象的标签将为label=None。构建BoundField对象时,如果labelNone,则会从字段的标签或字段名称中获取标签。