需要登录
本课属于 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 会将他们送回该页面。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 在线编辑器