2009-04-21 7 views
11

類似のレイアウトを必要とするオブジェクトのリストがオブジェクトのクラスに基づいて設定されている必要がある場合クラスなどxxの値はテンプレート内では使用できません。私はここに欠けている別のアプローチは、おそらくありDjangoテンプレート内のオブジェクトのクラスを取得するにはどうすればよいですか?

 
{% for obj in objects %} 
<div class={{obj.__class__.__name__}} 
    .. 
</div> 
{% endfor }} 

..

答えて

10

少し汚れソリューション

オブジェクトがモデルに属しているクエリセットである場合は、あなたがにカスタムメソッドを追加することができますあなたのモデル。

class mymodel(models.Model): 
    foo = models........ 


def get_cname(self): 
    class_name = .... 
    return class_name 

その後、テンプレートであなたが試すことができます:

{% for obj in objects %} 
    <div class="{{obj.get_cname}}"> 
    .. 
    </div> 
{% endfor }} 
+0

ええ、ありがとう - それは私が思い付いたものです。 –

26

ます。また、カスタムフィルタを書くことができます。私のuse caseは、Djangoフォームのhtml要素がチェックボックスかどうかをチェックすることでした。このコードはDjango 1.4でテストされています。

私は約Custom Filtersの指示に従った。私のフィルタコードはそのように見えます。 myapp/templatetags/class_tag.py

:あなたのテンプレートファイルで

from django import template 
register = template.Library() 
@register.filter(name='get_class') 
def get_class(value): 
    return value.__class__.__name__ 

{% load class_tag %} 

{% if Object|get_class == 'AClassName' %} 
do something 
{% endif %} 


{{ Object|get_class }} 
+1

これはより良い解決策です –

0

ビット単純。単一モデルのリストは、あなたのレイアウトをされたと仮定すると:

その後
class ObjectListView(ListView): 
    model = Person 
    template_name = 'object_list.html' 

    def model_name(self): 
     return self.model._meta.verbose_name 

object_list.htmlに:あなたは、これはいくつかのクラスのために必要がある場合は、カスタムフィルタの

{% for obj in object_list %} 
    <div class="{{view.model_name}}">...</div> 
{% endfor }} 
0

Davidの提案は素晴らしいです。

Djangoのドキュメントはdevサーバが新しいtemplatetagsを自動的に検出しないことを無視しています。私が手動で再起動するまでは、TemplateSyntaxError class_tag is not a registered tag libraryがついていました。

関連する問題