Yura YuLife

ITエンジニアの覚え書き。

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

参考URL