Menu
CoddyTech

成功提示消息

本课属于 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 会将它们标记为已读,因此每条消息只会显示一次。

challenge icon

挑战

简单

告知访客每次保存都已成功。

  1. 在 events/views.py 中,每次保存后、重定向前添加一条成功消息:在 new_event 中添加 Your event was added.,在 edit_event 中添加 Your changes were saved.,在 delete_event 中添加 The event was deleted.
  2. 在 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})
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

表单中的所有课

自己练习: Django 在线编辑器