2009-11-27 9 views
37

フォームのフィールドを反復していますが、特定のフィールドでは少し異なるレイアウトが必要です。変更されたHTMLが必要です。テンプレート内からDjangoフォームウィジェットのタイプを取得します

これを正確に行うには、ウィジェットタイプを知っている必要があります。クラス名など。標準のPythonでは、これは簡単です! field.field.widget.__class__.__name__

残念ながら、テンプレートのアンダースコア変数にはアクセスできません。 素晴らしい!

あなたできテストfield.field.widget.input_typeが、テキスト/パスワード<input ../>種類については、この唯一の作品。私はそれ以上の解決策が必要です。

私には難しいかもしれませんが、テンプレートレベルでこれを行うのが最も理にかなっています。フィールドのHTMLを扱うコードを、フィールドループに含まれる別のテンプレートに委託しました。これは、ModelFormと標準Formの間で一貫していることを意味します(中間フォームクラスを作成した場合は真実ではありません)。

私に20奇数のフォームを編集する必要のない普遍的なアプローチが見える場合は、私にも教えてください!

+0

関連するバグレポートまたは機能要求:https://code.djangoproject.com/ticket/13009 – Flimm

答えて

4

、あなただけwidget.input_typeを使用することができます。例:

{% for field in form.visible_fields %} 
    <input type="{{ field.field.widget.input_type }}" 
      id="{{ field.id_for_label }}" 
      name="{{ field.html_name }}" 
      placeholder="{{ field.label }}" 
      maxlength="{{ field.field.max_length }}" /> 
{% endfor %} 
40

テンプレートタグを作成すると効果がありますか?何かのようにfield.field.widget|widget_type

編集:Oli:良い点!私は、フィルタを書いた:

from django import template 
register = template.Library() 

@register.filter('klass') 
def klass(ob): 
    return ob.__class__.__name__ 

そして今{{ object|klass }}が正しくレンダリングされます。今、私はちょうどテンプレートのifステートメント内でそれを使用する方法を理解しなければなりません。

Oli#2からの編集:私はテンプレート内のif文章でその結果を使用する必要があったので、そのロジックをすべてtemplatetagに移しました。マジック。正しい方向に私を突きつけてくれてありがとう。

+0

ようこそSO btw。 – Oli

+1

このソリューションをお寄せいただきありがとうございます。 Edit#2に関しては、Django 1.2で拡張された 'ifタグ 'を使って、テンプレート内でこれらのウィジェットタイプの比較を行うことができます。私は別の答えとして例を挙げました。 – zlovelady

+1

さらに、(Python以外の人があなたのテンプレートを扱う場合)追加する素敵なフィルタは、あなたの最もよく使用されているケースのためのものです: 'def is_checkboxes(form_field_obj): return(form_field_obj .__ class __.__ name__ ==" CheckboxSelectMultiple ")' ... 'あなたが' {%if field | is_checkboxes%} 'を実行し、人々がフリークアウトしないようにする(返りません) – hangtwenty

33

Django 1.2のenhanced if tagでは、if tagの比較でフィルタを使用できます。オリからの回答とrinti後

<ul> 
{% for field in form.fields %} 
    <li> 
    {% if field.field.widget|klass == "Textarea" %} 
    <!-- do something special for Textarea --> 
    <h2>Text Areas are Special </h2> 
    {% else %}  
     {{ field.errors }} 
     {{ field.label_tag }} 
     {{ field }} 
    {% endif %} 

    </li> 
{% endfor %} 
</ul> 
+3

フォローアップのための+1 – Oli

+0

* field.widget *を使用するのとは対照的に、* field.field.widget *の目的は何ですか? – Wipqozn

+0

私の経験では 'field.widget'は何も生成しません - 私はこれについてはわかりませんが、手動で設定した場合にのみ設定されるかもしれません。 'field.field.widget'が動作します。 – hangtwenty

16

:だから、今ではのようなテンプレートでカスタムHTML /ロジックを行うことができます私はこの1つを使用し、私はそれが少し単純だと思う:

テンプレートコード:{{ field|fieldtype }}

フィルターコード:ジャンゴ1.11のよう

from django import template 
register = template.Library() 

@register.filter('fieldtype') 
def fieldtype(field): 
    return field.field.widget.__class__.__name__ 
関連する問題