0

フィールドラベルは知っています(「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)
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返すだけであり、テンプレートで自分自身をレンダリングする方法を知っているのはオブジェクトだけです。FieldBoundFieldBoundField

また、bop フィールド コンストラクターにキーワード引数としてラベルを渡さないと、元の関数が機能しないと思います。コンストラクターが で呼び出された場合、Fieldオブジェクトのラベルは になります。オブジェクトが構築されるとき、ラベルはフィールドのラベルから取得されるか、フィールドの名前( isの場合) から取得されます。Nonelabel=NoneBoundFieldlabelNone

于 2012-12-08T01:42:51.527 に答える