Menu
CoddyTech

编辑活动

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

现在,每个活动页面都有一个编辑此活动链接,指向 /events/1/edit/。URL、链接和模板都已准备好,edit_event 也已经能找到 URL 指定的活动。视图的其余部分就交给你了。

如果把现有行作为 instance 传给 ModelForm,它就会编辑这行数据。以笔记应用中的一条笔记为例:

note = get_object_or_404(Note, pk=4)

form = NoteForm(instance=note)                # 填入这条笔记的值

form = NoteForm(request.POST, instance=note)  # 这条笔记的新值
if form.is_valid():
    form.save()                               # 更新笔记 4,不新增行

不传入数据时,NoteForm(instance=note) 会绘制一个表单,并填入这行数据当前的值。传入数据时,instance=note 会让 form.save() 更新这行数据,而不是新建一行。

编辑页面两者都需要。GET 时忘了传入实例,访问者看到的就是空表单;POST 时忘了传入实例,保存时就会添加一份副本。

challenge icon

挑战

简单

在 events/views.py 中替换注释,完成 edit_event。末尾的 render() 已经传入了 event,请在它旁边添加 form。

  • GET 请求会显示已填入活动详情的表单。
  • 有效的 POST 请求会保存更改,不会添加新活动,并重定向到活动页面。
  • 无效的 POST 请求会重新显示页面和错误信息。

将 Place 改为 Town Hall,然后按“保存更改”:活动页面会显示 Town Hall。

亲手试试

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)
    # 像 new_event 一样,为这个活动创建表单,验证后保存。
    return render(request, "events/edit_event.html", {"event": event})
quiz icon自我测试

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

表单中的所有课

自己练习: Django 在线编辑器