Skip to content

表单层 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 username

CSRF 为什么一定要理解

表单提交时,模板里经常会写:

html
{% csrf_token %}

这是为了防止跨站请求伪造攻击。
你现在不需要把安全原理全部吃透,但至少要知道:

  • 它不是可有可无的装饰
  • 没写时很多 POST 请求会直接失败

学这一页最重要的目标

  • 会定义基础表单
  • 会在视图中接收和校验表单
  • 会在模板中渲染表单
  • 知道 form.is_valid() 的意义

Built with VitePress.