Djangoでユーザがグループに所属しているかを判定する
Djangoで、特定のグループに所属しているユーザのみにリンクやページを表示する場合に、以下のような方法があります。
テンプレートタグを用いる方法
テンプレートタグを用いると、ユーザの所属するグループによってページ内の情報やリンクを出しわけることができます。
使い方
以下のin_group.pyというスクリプトを、アプリ内のtemplatetags/ディレクトリに格納。
hoge/templatetags/in_group.py
from django.template import Library register = Library() @register.filter def in_group(user, team_name): if user.groups.filter(name=team_name).exists(): return True else: return False
テンプレート内でin_groupを呼び出します。
{% load in_group %}
{% if user|in_group:"developer" %}
<!-- developerというグループに所属するユーザ用のリンク -->
<a href="#">開発者向けページ</a>
{% else %}
<!-- その他のユーザ用のリンク -->
<a href="#">権限を申請</a>
{% endif %}
if文と組み合わせることで、特定のグループのユーザのみに情報を表示したり、隠したりすることができます。
user_passes_testを利用する方法
上記のテンプレートタグを利用する方法では、リンクや情報を特定のグループのユーザのみに表示することはできますが、特定ページへのアクセスを制限することはできません。
そこで、user_passes_testというデコレータを利用することで、特定の条件を満たしたユーザのみがページにアクセスできるようにします。
使い方
views.py
from django.contrib.auth.decorators import login_required, user_passes_test from django.shortcuts import render @login_required @user_passes_test(lambda user: user.groups.filter(name='developer').exists()) def developer_page(request): u'''ログイン済みでdeveloperグループに所属するユーザのみアクセス可能なページ''' return render(request, 'developer.html', {})
user_passes_testの条件を満たさないユーザはログインページへ飛ばされます。スタッフ権限を持たないユーザが管理サイトへログインしようとした際の挙動と同じですね。