Menu
CoddyTech

ログイン必須

CoddyのDjangoジャーニー「ユーザーとアカウント」セクションの一部。レッスン 6/16。

誰でも/new/を開いて、ログインしているかどうかにかかわらずメモを書くことができます。「新しいメモ」リンクを隠しても役に立ちません。訪問者はアドレスを入力できるからです。ビュー自体でアクセスを拒否する必要があります。

デコレーターとは、関数の上に置かれ、その関数を追加のコードで包む、@で始まる行です。@login_requiredは、ビューが実行される前にrequest.userを確認します。たとえば、ショップではチェックアウトへのアクセスを制限します。

from django.contrib.auth.decorators import login_required


@login_required
def checkout(request):
    ...

ログイン済みのユーザーにはページが表示されます。訪問者は、アクセスしようとしていたページを示す/accounts/login/?next=/checkout/を付けてログインページにリダイレクトされ、ログイン後にLoginViewによって元のページに戻されます。ログインページのアドレスはLOGIN_URL設定で指定します。デフォルトは/accounts/login/で、あなたの設定はすでにそのアドレスになっています。

challenge icon

チャレンジ

簡単
  • ログイン中のユーザーだけが、ノートの作成、編集、削除を行えます。
  • ノートの一覧と個別ページは、誰でも閲覧できます。

「実行」を押し、ログアウトした状態で /new/ を開きます。ada(パスワード coddy-pass-123)でログインすると、/new/ に戻ります。

自分で試してみよう

from django.contrib.auth import login
from django.contrib.auth.forms import UserCreationForm
from django.shortcuts import get_object_or_404, redirect, render

from .forms import NoteForm
from .models import Note


def note_list(request):
    notes = Note.objects.all()
    return render(request, "notes/note_list.html", {"notes": notes})


def note_detail(request, pk):
    note = get_object_or_404(Note, pk=pk)
    return render(request, "notes/note_detail.html", {"note": note})


def note_create(request):
    if request.method == "POST":
        form = NoteForm(request.POST)
        if form.is_valid():
            note = form.save()
            return redirect("notes:detail", pk=note.pk)
    else:
        form = NoteForm()
    return render(request, "notes/note_form.html", {"form": form})


def note_edit(request, pk):
    note = get_object_or_404(Note, pk=pk)
    if request.method == "POST":
        form = NoteForm(request.POST, instance=note)
        if form.is_valid():
            form.save()
            return redirect("notes:detail", pk=note.pk)
    else:
        form = NoteForm(instance=note)
    return render(request, "notes/note_form.html", {"form": form, "note": note})


def note_delete(request, pk):
    note = get_object_or_404(Note, pk=pk)
    if request.method == "POST":
        note.delete()
        return redirect("notes:list")
    return render(request, "notes/note_confirm_delete.html", {"note": note})


def signup(request):
    if request.method == "POST":
        form = UserCreationForm(request.POST)
        if form.is_valid():
            user = form.save()
            login(request, user)
            return redirect("notes:list")
    else:
        form = UserCreationForm()
    return render(request, "notes/signup.html", {"form": form})

ユーザーとアカウントのすべてのレッスン

自分で練習してみよう: Djangoプレイグラウンド