Menu
CoddyTech

Ghi chú của người khác

Thuộc phần Người dùng và tài khoản trong hành trình Django của Coddy. Bài học 10 trên 16.

Danh sách ẩn ghi chú của người khác, nhưng các trang ghi chú thì không. Ghi chú được đánh số /1/, /2/, /3/, nên bất kỳ ai cũng có thể thử số tiếp theo để đọc ghi chú. Chỉ ẩn liên kết trong danh sách là chưa đủ: mỗi trang đều phải kiểm tra.

get_object_or_404() chấp nhận các điều kiện tìm kiếm giống như filter(), với số lượng tùy ý, và chỉ tìm thấy một hàng khi tất cả điều kiện đều khớp. Trang cửa hàng chỉ hiển thị những đơn hàng vẫn còn mở:

order = get_object_or_404(Order, pk=pk, status="open")

Đơn hàng đã đóng sẽ trả về 404 Page not found, giống như đơn hàng có số không tồn tại. Với một hàng riêng tư, đây là chủ ý: lỗi 403 Forbidden sẽ cho người lạ biết rằng hàng đó tồn tại.

Order.objects.get() sẽ phát sinh DoesNotExist thay vào đó, và khách truy cập sẽ gặp lỗi 500 Server Error, tức là chương trình bị sập.

challenge icon

Thử thách

Dễ

Trong note_detail, chỉ hiển thị ghi chú cho chủ sở hữu của ghi chú đó. Nếu ghi chú thuộc về người khác hoặc số đó không tồn tại, trang sẽ trả về lỗi 404.

Đăng nhập bằng tài khoản bob (mật khẩu coddy-pass-123) rồi mở /1/, một trong các ghi chú của ada: 404 Không tìm thấy trang.

Tự làm thử

from django.contrib.auth import login
from django.contrib.auth.decorators import login_not_required
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.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)
    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)
    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})


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

Tất cả bài học trong Người dùng và tài khoản

Tự luyện tập: Playground Django