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.
Thử thách
DễCho khách truy cập biết mỗi lần lưu đã thành công.
- 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: trongnew_eventlàYour event was added., trongedit_eventlàYour changes were saved., trongdelete_eventlàThe event was deleted. - 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})
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