POST 表单
本课属于 Coddy Django 学习旅程的“表单”单元。第 2 课,共 20 课。
页面 /events/new/ 及其视图已经准备就绪,但页面还没有用于添加活动的表单。修改数据的表单会使用 method="post":浏览器会将字段发送到请求正文中,而不是 URL 中。视图会从 request.POST 中读取这些字段,并通过每个输入项的 name 来索引。
Django 还会保护每个 POST 表单。其他网站可能会隐藏一个向你的网站提交数据的表单,而访客的浏览器会连同 Cookie 一起发送它。这种攻击称为跨站请求伪造,简称 CSRF。因此,如果 POST 请求没有来自你自己页面的秘密令牌,Django 就会拒绝该请求,并返回 403 Forbidden。在表单中加入 {% csrf_token %} 会写入这个令牌。下面是一个新闻订阅表单:
<form method="post">
{% csrf_token %}
<label for="email">Email</label>
<input id="email" name="email" type="email">
<button type="submit">Subscribe</button>
</form><label> 用来标注输入项,其 id 与标签的 for 相匹配;type="date" 会显示日历。
挑战
简单在 events/templates/events/new_event.html 中,用表单替换 {# Write the form here #}。
- 使用
method="post",并将{% csrf_token %}放在最前面。否则,Django 会以 403 错误拒绝此表单。 - 添加带标签的输入框,分别用于
title、date(使用type="date")和place,然后添加一个提交按钮。
添加一个活动,然后点击“所有活动”:它会出现在列表中。
亲手试试
{% extends "events/base.html" %}
{% block title %}Add an event{% endblock %}
{% block content %}
<h1>Add an event</h1>
{# 在这里编写表单 #}
{% endblock %}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
表单中的所有课
自己练习: Django 在线编辑器