2012-05-07 9 views
0

すべてのページ(base.html)には、request.userに私のクラスUserTypesの管理者ロールがあるかどうかをチェックし、管理リンクを表示したいと考えています。現在、私はこのような何か:DjangoテンプレートでM2Mの値をチェックする方法はありますか?

{% if user.profile.user_types.all %} 
    {% for user_type in user.profile.user_types.all %} 
     {% if user_type.name == "ad" %} 
      <li> 
       <a href="{% url admin:index %}" class="round button dark ic-settings image-left">Admin</a> 
      </li> 
     {% endif %} 
    {% endfor %} 
{% endif %} 

user.profileは単に私のUserProfileにDjangoのUserから起こっています。

しかし、これは少し冗長で厄介なようです。もっと簡単な方法はありますか?たぶん私は自分のカスタムコンテキストプロセッサを書くこととis_adminか何かのように変数を渡すが、私はあなたがあなたのUserProfileモデルがモデルにビジネスロジックを移動する方法is_adminを追加することができます

+1

「User.is_superuser」に頼っているのではないでしょうか。または、 "管理者"がDjangoの管理者 'User.is_staff'にアクセスするユーザーを意味する場合正当な理由がないのに複雑さを増やしているようです。 –

答えて

5

前にカスタムコンテキストプロセッサを...書いたことはありません。

なお、あなたのDBへの建設

よう
{% if user.profile.user_types.all %} 
    {% for user_type in user.profile.user_types.all %} 
    ... 
    {% endfor %} 
{% endif %} 

安打2のSQLクエリが。しかし、withテンプレートタグは1ヒットに減らします。

{% with types=user.profile.user_types.all %} 
{% if types %} 
    {% for user_type in types %} 
    ... 
    {% endfor %} 
{% endif %} 
{% endwith %} 

実際には、これはモデルに最適です。しかし、djangoがあなたの目的のために提供するもの(contrib.auth、permissions、user groups)を学ばなければなりません。おそらくあなたは車輪を再発明するでしょう。

条件{% if user_type.name == "ad" %}は、あなたのPythonコード(特にテンプレート)にハードコードするべきではありません。

関連する問題