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
の条件を満たさないユーザはログインページへ飛ばされます。スタッフ権限を持たないユーザが管理サイトへログインしようとした際の挙動と同じですね。