个人资料页面
本课属于 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" }}。
挑战
中等添加个人资料页面。
- 在
notes/views.py中编写profile:渲染notes/profile.html,并传入用户的笔记数量。 - 在
notes/urls.py中添加名为profile的profile/路径。 - 创建继承自
notes/base.html的profile.html。在<h1>中单独显示用户名,然后显示You have 2 notes.。使用pluralize,这样一条笔记时显示You have 1 note. - 在
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 在线编辑器