2012-05-07 3 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에 장고의 User에서 것입니다 : 현재 내가 이런 일을한다.

그러나 이것은 약간 장황하고 clunky 것 같습니다. 더 간단한 방법이 있습니까? 어쩌면 내가 내 자신의 사용자 정의 컨텍스트 프로세서를 작성하고 is_admin이나 뭐 같은 변수를 전달,하지만 당신은 당신의 UserProfile 모델은 모델에 비즈니스 로직을 이동하는 방법 is_admin을 추가 할 수 있습니다

+1

아마도 'User.is_superuser'를 신뢰하지 않는 이유는 무엇입니까? 또는 "관리자"가 장고 관리자'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" %}을 파이썬 코드 (특히 템플릿)에 하드 코딩해서는 안됩니다.

관련 문제