Menu
CoddyTech

로그인 필요

Coddy Django 여정의 사용자와 계정 섹션에 포함된 레슨. 16개 중 6번째.

누구나 로그인 여부와 관계없이 /new/를 열어 메모를 작성할 수 있습니다. 새 메모 링크를 숨겨도 소용없습니다. 방문자는 주소를 직접 입력할 수 있습니다. 뷰 자체에서 접근을 거부해야 합니다.

데코레이터는 함수 위에 @로 시작하는 줄로, 함수에 추가 코드를 씌웁니다. @login_required는 뷰가 실행되기 전에 request.user를 확인합니다. 상점에서 결제 페이지를 보호하는 방법은 다음과 같습니다.

from django.contrib.auth.decorators import login_required


@login_required
def checkout(request):
    ...

로그인한 사용자는 페이지를 볼 수 있습니다. 방문자는 주소에 원래 원했던 페이지가 포함된 로그인 페이지로 리디렉션됩니다. 주소는 /accounts/login/?next=/checkout/이며, 로그인한 뒤 LoginView가 해당 페이지로 돌려보냅니다. Django는 LOGIN_URL 설정을 통해 로그인 페이지를 찾습니다. 기본값은 로그인 페이지의 주소인 /accounts/login/이므로 설정할 필요가 없습니다.

challenge icon

챌린지

쉬움

notes/views.py에서 로그인한 사용자만 note_create, note_edit, note_delete에 접근하도록 하세요. note_list와 note_detail은 계속 공개 상태로 둡니다.

로그아웃한 상태에서 /new/를 여세요. 로그인 페이지로 이동하며 주소에 ?next=/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 플레이그라운드