0

我知道字段标签(让我们说“BOP”)。我想创建一个模板标签,它将返回正确的字段对象,这样我就可以在这样的表单中使用它。

{% 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)
4

1 回答 1

2

试试这个:

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

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

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

另外,我相信如果您不将标签作为关键字参数传递给您的 bop 字段构造函数,那么您的原始函数将无法工作。如果使用 调用构造函数,则对象的标签Field将是。构造对象时,标签取自字段的标签,如果是,则取自字段的名称。Nonelabel=NoneBoundFieldlabelNone

于 2012-12-08T01:42:51.527 回答