成功提示消息
本课属于 Coddy Django 学习旅程的“表单”单元。第 15 课,共 20 课。
保存后,访客会进入活动页面,但页面上没有任何提示表明保存成功。这个视图无法把变量传给该页面:另一个视图会在下一次请求中绘制它。
Django 的 消息框架可以在重定向期间传递一条消息。视图会在重定向前添加消息;Django 会为该访客保留这条消息,并将它交给下一个绘制的页面。保存评论的博客可以这样做:
from django.contrib import messages
comment.save()
messages.success(request, "Thanks, your comment is posted.")
return redirect("blog:post", pk=post.pk)每个模板都会获得一个 messages 变量,因此基础模板可以在每个页面上显示这些消息:
{% for message in messages %}
<p class="note">{{ message }}</p>
{% endfor %}遍历 messages 会将它们标记为已读,因此每条消息只会显示一次。
挑战
简单告知访客每次保存都已成功。
- 在
events/views.py中,每次保存后、重定向前添加一条成功消息:在new_event中添加Your event was added.,在edit_event中添加Your changes were saved.,在delete_event中添加The event was deleted. - 在
base.html中的{% block content %}上方,将每条消息显示为<ul class="messages">内的一个<li>,并且只有在有消息时才显示列表。
添加活动后,页面顶部会显示 Your event was added.,重新加载页面后,这条消息就会消失。
亲手试试
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})
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
表单中的所有课
自己练习: Django 在线编辑器