表单层 Form
表单层的作用,不只是生成输入框,更重要的是“统一收集和校验用户提交的数据”。
为什么表单层重要
如果没有表单层,你也能直接处理用户提交的数据。
但问题是:
- 校验逻辑会散落在很多地方
- 错误提示不统一
- 代码会越来越乱
而表单层就是帮你把这些逻辑收拢起来。
定义一个最基础的表单
python
from django import forms
class LoginForm(forms.Form):
username = forms.CharField(max_length=20)
password = forms.CharField(max_length=20, widget=forms.PasswordInput)这里定义了两个字段:
- 用户名
- 密码
在视图中使用表单
python
from django.shortcuts import render
from .forms import LoginForm
def login_view(request):
if request.method == "POST":
form = LoginForm(request.POST)
if form.is_valid():
return render(request, "success.html")
else:
form = LoginForm()
return render(request, "login.html", {"form": form})模板中渲染表单
html
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">登录</button>
</form>验证数据
表单最关键的一步是:
python
form.is_valid()只有它返回 True,你才说明用户提交的数据符合规则。
获取校验通过后的数据
python
username = form.cleaned_data["username"]
password = form.cleaned_data["password"]自定义验证器
当默认规则不够用时,你可以写自己的校验逻辑:
python
def clean_username(self):
username = self.cleaned_data["username"]
if username == "admin":
raise forms.ValidationError("这个用户名不能使用")
return usernameCSRF 为什么一定要理解
表单提交时,模板里经常会写:
html
{% csrf_token %}这是为了防止跨站请求伪造攻击。
你现在不需要把安全原理全部吃透,但至少要知道:
- 它不是可有可无的装饰
- 没写时很多 POST 请求会直接失败
学这一页最重要的目标
- 会定义基础表单
- 会在视图中接收和校验表单
- 会在模板中渲染表单
- 知道
form.is_valid()的意义