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 会将他们送回该页面。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 在线编辑器