web-dev-qa-db-ja.com

Djangoテンプレート内のオブジェクトのモデル名

Djangoテンプレート内のオブジェクトのモデル名を取得する方法はありますか。手動で、モデル内のメソッドを定義するか、テンプレートタグを使用して、それを試すことができます...しかし、組み込みのものはありますか?仕方?

36
Neo

object.__class__.__name__またはobject._meta.object_nameはモデルクラスの名前を与えるはずです。ただし、属性名はアンダースコアで始まるため、これはテンプレートでは使用できませんです。

テンプレートからその値を取得する組み込みの方法はないため、その属性を返すモデルメソッドを定義する必要があります。または、より汎用的で再利用可能なソリューションの場合は、テンプレートフィルターを使用します。

@register.filter
def to_class_name(value):
    return value.__class__.__name__

テンプレートで次のように使用できます。

{{ obj | to_class_name }}
57
Shawn Chin

クラス名に直接アクセスすることはできません。このようなことをする:

{{ object.__class__ }}

TemplateSyntaxError: Variables and attributes may not begin with underscores。 Djangoではこれらの種類の属性にアクセスできません-Python規則は、それらがオブジェクトのAPIの一部ではなく、非表示の実装詳細であることを意味します。

代わりにテンプレートフィルターを作成すると、次のように使用できます。

{{ object|model_name_filter }}

フィルターの作成は非常に簡単です: https://docs.djangoproject.com/en/dev/howto/custom-template-tags/

5
Gareth

Djangoは_metaと呼ばれるモデルオプションにパブリックにアクセス可能なAPIを追加しましたが、テンプレートでアンダースコアを使用して変数にアクセスすることはできません。テンプレートフィルターを使用します。

@register.filter
def verbose_name(instance):
    return instance._meta.verbose_name

テンプレート:

{{ instance|verbose_name }}

テンプレート内の単語を大文字にするためにtitleフィルターをチェーンすることも好きです。

{{ instance|verbose_name|title }}
0
Bobort