Menu
CoddyTech

Thông báo thành công

Thuộc phần Biểu mẫu trong hành trình Django của Coddy. Bài học 15 trên 20.

Sau khi lưu, khách truy cập chuyển đến trang của sự kiện, nhưng không có gì cho biết thao tác lưu đã thành công. View không thể truyền một biến đến trang đó: một view khác sẽ dựng trang trong yêu cầu tiếp theo.

messages framework của Django mang một lời nhắn qua bước chuyển hướng. View thêm lời nhắn trước khi chuyển hướng; Django giữ lời nhắn đó cho khách truy cập ấy rồi chuyển cho trang tiếp theo được dựng. Một blog lưu bình luận như sau:

from django.contrib import messages

comment.save()
messages.success(request, "Thanks, your comment is posted.")
return redirect("blog:post", pk=post.pk)

Mọi mẫu đều nhận biến messages, vì vậy mẫu cơ sở có thể hiển thị chúng trên mọi trang:

{% for message in messages %}
<p class="note">{{ message }}</p>
{% endfor %}

Lặp qua messages sẽ đánh dấu các lời nhắn là đã đọc, vì vậy mỗi lời nhắn chỉ hiển thị một lần.

challenge icon

Thử thách

Dễ

Cho khách truy cập biết mỗi lần lưu đã thành công.

  1. Trong events/views.py, thêm thông báo thành công sau mỗi lần lưu, trước lệnh chuyển hướng: trong new_event là Your event was added., trong edit_event là Your changes were saved., trong delete_event là The event was deleted.
  2. Trong base.html, phía trên {% block content %}, hiển thị từng thông báo dưới dạng một <li> bên trong <ul class="messages">, và chỉ hiển thị danh sách khi có thông báo.

Thêm một sự kiện: Your event was added. xuất hiện ở trên cùng và biến mất khi tải lại trang.

Tự làm thử

from django.shortcuts import get_object_or_404, redirect, render

from .forms import EventForm
from .models import Event


def event_list(request):
    q = request.GET.get("q", "")
    events = Event.objects.all()
    if q:
        events = events.filter(title__icontains=q)
    return render(request, "events/event_list.html", {"events": events, "q": q})


def event_detail(request, pk):
    event = get_object_or_404(Event, pk=pk)
    return render(request, "events/event_detail.html", {"event": event})


def new_event(request):
    if request.method == "POST":
        form = EventForm(request.POST)
        if form.is_valid():
            event = form.save()
            return redirect("events:detail", pk=event.pk)
    else:
        form = EventForm()
    return render(request, "events/new_event.html", {"form": form})


def edit_event(request, pk):
    event = get_object_or_404(Event, pk=pk)
    if request.method == "POST":
        form = EventForm(request.POST, instance=event)
        if form.is_valid():
            form.save()
            return redirect("events:detail", pk=event.pk)
    else:
        form = EventForm(instance=event)
    return render(request, "events/edit_event.html", {"form": form, "event": event})


def delete_event(request, pk):
    event = get_object_or_404(Event, pk=pk)
    if request.method == "POST":
        event.delete()
        return redirect("events:list")
    return render(request, "events/delete_event.html", {"event": event})
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Biểu mẫu

Tự luyện tập: Playground Django