2012-12-08 28 views
0

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

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

我templatetag不工作,我知道我必须忽视的东西明显..

@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) 
+0

功能看起来对我很好。你确定它被叫?您是否已将自定义模板标记加载到模板中? –

+0

你是对的功能似乎工作,但模板似乎呈现类的字符串.. – rh0dium

回答

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字段构造函数,您的原始函数将不起作用。如果使用label=None调用构造函数,则Field对象的标签将为None。当构建BoundField对象时,标签将从字段的标签中获取,或者如果labelNone,则从该字段的名称中获取标签。

+0

荣誉给你!恭喜你钉了它。 FWIW我的字面意思是达到了同样的理解。从n00b到SO真的很好。欢迎登机!此外,如果你正在寻找工作,我可以使用一些帮助! – rh0dium