2011-09-15 8 views
5

オブジェクトは、ここでジャンゴ - テンプレートディスプレイモデルverbose_names&Iは、いくつかのモデルを表示する必要が

は私ビュー

def contents(request): 
    """Lists contents""" 
    objects = [ 
    Model1.objects.all(), 
    Model2.objects.all(), 
    Model3.objects.all(), 
    Model4.objects.all(), 
    ] 
    return render_to_response('content/contents.html', objs 
    , context_instance=RequestContext(request) 
) 

そして、私のテンプレートでテンプレート内&オブジェクトに名前を付ける

{% for objs in objects %} 
    <div class="content"> 
    <div class="title">{{ objs._meta.verbose_name }}</div> 
    <ul> 
    {% for obj in objs %} 
     <li>{{ obj }}</li> 
    {% endfor %} 
    </ul> 
    </div> 
{% endfor %} 

もちろんobjs._meta.verbose_nameは機能しません

モデルごとに関数を作成したり、各モデルのビューから値を割り当てることなく、この詳細な名前にアクセスする方法はありますか?

答えて

11

あなたのテンプレートにアクセスするために、Djangoはアンダースコアの接頭辞を使ってテンプレートの属性にアクセスすることはできません。このように、各モデルにモデルのメソッドを作成することなく、任意のオブジェクトのための冗長な名前にアクセスするための最も簡単な方法は、単にテンプレートタグを作成するには、次のようになります。

@register.simple_tag 
def get_verbose_name(object): 
    return object._meta.verbose_name 

非血縁ていますが、テンプレートのバグを持っていますオブジェクトの代わりにクエリーセットの_meta属性にアクセスしようとしています。だから、あなたのタイトルラインは、代わりに次のように見えるべきです:

{% with objs|first as obj %} 
    <div class="title">{% get_verbose_name obj %}</div> 
{% endwith %} 
+0

働いています。私は '{get_verbose_name objs.0%}'を最終的に使用しました(値がない場合は動作しません)。 –

+0

うれしかった! – Spike

+9

フィルターを使用している方がきれいです。これはほぼ同じ実装ですが、呼び出しメソッドがよりよく見えます。 '{{obj | verbose_name}}'や '{{obj.0 | verbose_name}} 'のようなもの –