40


13

テンプレート内からDjangoフォームウィジェットのタイプを取得する

フォームのフィールドを繰り返し処理しており、特定のフィールドでは、HTMLを変更する必要があるわずかに異なるレイアウトが必要です。

これを正確に行うには、ウィジェットの種類を知るだけです。 クラス名または類似したもの。 標準のPythonでは、これは簡単です! field.field.widget . class . name

残念ながら、テンプレート内のアンダースコア変数へのアクセスは許可されていません。 すばらしいです!

`field.field.widget.input_type`をテストすることができますが、これはtext / passwordのタイプに対してのみ機能します。 それ以上の解像度が必要です。

見た目はどんなに難しいかもしれませんが、テンプレートレベルでこれを行うのが最も理にかなっています。 フィールドのHTMLを処理するコードの一部を、フィールドループに含まれる別のテンプレートにアウトソーシングしました。 これは、 ModelForm`と標準の Form`で一貫していることを意味します(中間フォームクラスを記述した場合は当てはまらないものです)。

20種類のフォームを編集する必要のない普遍的なアプローチが見られる場合は、お知らせください!

5 Answer


43


テンプレートタグを作成するとうまくいくでしょうか? `field.field.widget | widget_type`のようなもの

オリから編集:良い点! フィルターを作成しました。

from django import template
register = template.Library()

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

そして今、 `{{object | klass}}`は正しくレンダリングされます。 これで、テンプレートの「if」ステートメント内でそれを使用する方法を理解することができました。

Oliからの編集#2:その結果をテンプレート内のifステートメントで使用する必要があったため、そのすべてのロジックをテンプレートタグにシフトしました。 魔法。 正しい方向に私をつついてくれてありがとう。


35


Django 1.2の強化された「ifタグ」を使用すると、「ifタグ」の比較でフィルターを使用できます。 したがって、次のようにテンプレートでカスタムhtml / logicを実行できます。

{% for field in form.fields %}

    {% if field.field.widget|klass == "Textarea" %}

    Text Areas are Special
    {% else %}
      {{ field.errors }}
      {{ field.label_tag }}
      {{ field }}
    {% endif %}


{% endfor %}


17


Oliとrintiからの回答に続いて、私はこれを使用しましたが、もう少し簡単だと思います

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

フィルターコード:

from django import template
register = template.Library()

@register.filter('fieldtype')
def fieldtype(field):
    return field.field.widget.__class__.__name__


13


Django 1.11の時点では、 `widget.input_type`を使用できます。 例:

{% for field in form.visible_fields %}

{% endfor %}


0


https://github.com/jazzband/django-widget-tweaks [django-widget-tweaks]がこの目的のために` field_type`および `widget_type`テンプレートフィルターを提供し、それぞれのクラスを返すことを現代の読者に指摘する価値があるかもしれません小文字の名前。 以下の例では、フィールドウィジェットの(input_type`プロパティの出力(Django 1.11以降)も示していますが、これも役立つ場合があります。

forms.py

class ContactForm(forms.Form):
    name = forms.CharField(
        max_length=150,
        required=True,
        label='Your name'
    )

template.html

{% load widget_tweaks %}

{% for field in form.visible_fields %}
{{ field.label }}
{{ field.field.widget.input_type }}
{{ field|field_type }}
{{ field|widget_type }})
{% endfor %}

結果:

Your name
text
charfield
textinput

これらのさまざまなオプションの間で、ほぼすべてのユースケースを対象とする適切なプロパティを見つけることができるはずです。 これらのフィルターのいずれかの出力を「if」ステートメントで使用するためにキャプチャする必要がある場合は、https://docs.djangoproject.com/en/2.0/ref/templates/builtins/#with [`with`を使用できます]テンプレートタグ。