Menu
CoddyTech

检查输入

本课属于 Coddy Django 学习旅程的“表单”单元。第 4 课,共 20 课。

提交标题为空的表单后,公告板会收到一个没有名称的事件。request.POST 中可能包含任何内容,因此视图会在保存前检查它。

如果输入有误,视图不会保存任何内容,也不会重定向,而是重新渲染表单页面并显示一条消息。下面是一个可预订 1 到 8 位客人的餐桌预订表单:

guests = request.POST["guests"]
if not guests.isdigit() or not 1 <= int(guests) <= 8:
    problem = "Choose between 1 and 8 guests."
    return render(request, "tables/book.html", {"problem": problem})
Booking.objects.create(guests=int(guests))

检查要在 create() 之前进行:保存行之后再显示消息就太晚了。对于文本,.strip() 会移除两端的空格,因此只包含空格的标题会变成空字符串。模板只会在有消息时显示它:

{% if problem %}
<p class="warning">{{ problem }}</p>
{% endif %}
challenge icon

挑战

简单

拒绝没有标题的活动。

  1. 在 events/views.py 中的 new_event 里,如果标题为空或只有空格,就不保存任何内容,并重新显示表单页面,同时显示消息 Please give the event a title.。如果表单中有标题,则仍会添加活动并重定向。
  2. 在 new_event.html 中,在表单上方仅在有消息时显示该消息。

提交由 3 个空格组成的标题:你会看到 Please give the event a title.,并且不会保存任何内容。

亲手试试

from django.shortcuts import get_object_or_404, redirect, render

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":
        event = Event.objects.create(
            title=request.POST["title"],
            date=request.POST["date"],
            place=request.POST["place"],
        )
        return redirect("events:detail", pk=event.pk)
    return render(request, "events/new_event.html")
quiz icon自我测试

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

表单中的所有课

自己练习: Django 在线编辑器