Menu
CoddyTech

个人资料页面

本课属于 Coddy Django 学习旅程的“用户和账户”单元。第 14 课,共 16 课。

在这一章中,你要运用已有的知识来添加功能,获得的帮助也会更少。首先,创建一个属于你自己的页面:显示当前登录的用户以及他们写了多少条笔记。所需信息都在已登录的用户对象上:用户名,以及通过所有者字段的 related_name 获取的笔记。

要显示行数,可以向数据库查询数量。在图书馆网站上,author.books.count() 会运行一条 SELECT COUNT(*) 查询。len(author.books.all()) 得到的数量相同,但会先加载每本书。

英语中需要写成 1 book,但要写成 2 books。和第一个单元一样,筛选器 pluralize 会在数量不是 1 时添加 s:book{{ count|pluralize }}。也可以在引号中指定另一个词尾:box{{ count|pluralize:"es" }}。

challenge icon

挑战

中等

添加个人资料页面。

  1. 在 notes/views.py 中编写 profile:渲染 notes/profile.html,并传入用户的笔记数量。
  2. 在 notes/urls.py 中添加名为 profile 的 profile/ 路径。
  3. 创建继承自 notes/base.html 的 profile.html。在 <h1> 中单独显示用户名,然后显示 You have 2 notes.。使用 pluralize,这样一条笔记时显示 You have 1 note.
  4. 在 base.html 中添加指向该页面的 Profile 链接。

以 ada 的身份点击 Profile:You have 2 notes.

亲手试试

from django.contrib.auth import login
from django.contrib.auth.decorators import login_not_required, permission_required
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
from django.core.exceptions import PermissionDenied
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.filter(owner=request.user)
    return render(request, "notes/note_list.html", {"notes": notes})


def note_detail(request, pk):
    note = get_object_or_404(Note, pk=pk, owner=request.user)
    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(commit=False)
            note.owner = request.user
            note.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, owner=request.user)
    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, owner=request.user)
    if request.method == "POST":
        note.delete()
        return redirect("notes:list")
    return render(request, "notes/note_confirm_delete.html", {"note": note})


@login_not_required
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})


def stats(request):
    if not request.user.is_staff:
        raise PermissionDenied
    context = {"user_count": User.objects.count(), "note_count": Note.objects.count()}
    return render(request, "notes/stats.html", context)


@permission_required("notes.view_note", raise_exception=True)
def all_notes(request):
    notes = Note.objects.select_related("owner")
    return render(request, "notes/all_notes.html", {"notes": notes})

用户和账户中的所有课

自己练习: Django 在线编辑器