Django2.0でViewにアクセス権限を設けたい場合

Facebook にシェア
Pocket
LINEで送る
このエントリーを Google ブックマーク に追加

チュートリアルが難解だったので、簡単な使い方をば。
メモ書き程度なので、雑な説明になってしまっていることをご了承願いたい。
ただ、重要な部分はコメントを入れておく。

アクセス権限を設けたいappのmodels.pyに追記する

以下のようなpermissionをmodels.pyから作成する。

# Create your models here.
class PermissionModel(models.Model):

    # Mataクラスでpermissionを作成する。
    class Meta:
        permissions = (
            ("view_admin_page", "Can see admin pages."),
        )

migrateする。

python manage.py makemigrations
python manage.py migrate

ログイン時にアクセス権に応じてリダイレクトをかける

from django.contrib.auth import authenticate, login

def authentication(request):
    form = LoginForm(request.POST)
    if form.is_valid():
        username = form.cleaned_data['username']
        password = form.cleaned_data['password']
        user = authenticate(username=username, password=password)

        if user is not None:
            if user.is_active:
                login(request, user)
                ## 管理者権限を持っていたら管理者ページへ
                if user.has_perm("admin_pages"):
                    return redirect("/admin_pages")
                else:
                    return redirect("/user_pages")
    form.add_error(None, 'LOGIN_ID、またはPASSWORDが違います。')
    return render(request, 'accounts/login.html', 
                            {'form': form})

ログインしている状態でログインページにアクセスした場合にリダイレクトをかける

ログインしている状態でログインページにアクセスしたときに、ログイン画面がでると混乱するのでリダイレクトをかけてみた。

from django.contrib.auth import authenticate, login
from django.contrib.auth.models import User

def login_page(request):
    form = LoginForm()

    # ログインしていたらリダイレクト
    if request.user.id:
        user = User.objects.filter(id=request.user.id).first()

        if user.has_perm("view_admin_pages"):
            return redirect("/admin_pages")
        else:
            return redirect("/user_pages")

    return render(request, 'accounts/login.html', {'form': form, 'id': id})