로그인 필요
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/이므로 설정할 필요가 없습니다.
챌린지
쉬움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 플레이그라운드