2012-12-08 36 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