Django表单使用介绍
已于 2025年08月17日 16:26 修改
访问次数:0
📌 Django Form 使用教程
1. 为什么要用 Form?
在 Django 中,你可以直接在 HTML 写表单,然后在视图里用 request.POST 拿数据,但这样有几个问题:
- 需要手写验证逻辑(比如必填项、邮箱格式等)。
- 需要自己写错误提示。
- 不方便和 Model 结合。
所以 Django 提供了 Form 类,可以:
✅ 自动生成表单 HTML(可选)
✅ 自动验证输入数据是否合法
✅ 自动显示错误信息
✅ 和 Model 结合(ModelForm)
2. 普通 Form 示例
定义表单
在 forms.py 里写:
from django import forms
class LoginForm(forms.Form):
username = forms.CharField(label="用户名", max_length=100, required=True)
password = forms.CharField(label="密码", widget=forms.PasswordInput, required=True)
这里定义了一个登录表单,有两个字段:用户名和密码。
在视图里使用
在 views.py:
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(): # 自动检查合法性
username = form.cleaned_data["username"]
password = form.cleaned_data["password"]
# 这里可以写验证逻辑,比如查数据库
if username == "admin" and password == "123456":
return render(request, "success.html", {"username": username})
else:
form.add_error(None, "用户名或密码错误")
else:
form = LoginForm()
return render(request, "login.html", {"form": form})
在模板里渲染
login.html:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>登录</title>
</head>
<body>
<h2>用户登录</h2>
<form method="post">
{% csrf_token %}
{{ form.as_p }} <!-- 自动渲染成 <p> 包裹的输入框 -->
<button type="submit">登录</button>
</form>
</body>
</html>
Django 会自动生成:
<p><label for="id_username">用户名:</label>
<input type="text" name="username" maxlength="100" required id="id_username"></p>
<p><label for="id_password">密码:</label>
<input type="password" name="password" required id="id_password"></p>
3. 表单验证
Django Form 支持 字段级验证 和 整体验证。
字段级验证
class LoginForm(forms.Form):
username = forms.CharField(max_length=100)
password = forms.CharField(widget=forms.PasswordInput)
def clean_username(self):
data = self.cleaned_data["username"]
if "@" not in data:
raise forms.ValidationError("用户名必须包含 @ 符号")
return data
整体验证
class LoginForm(forms.Form):
username = forms.CharField(max_length=100)
password = forms.CharField(widget=forms.PasswordInput)
def clean(self):
cleaned_data = super().clean()
username = cleaned_data.get("username")
password = cleaned_data.get("password")
if username == "admin" and password != "123456":
raise forms.ValidationError("管理员密码错误")
4. ModelForm(和数据库模型结合)
如果你的表单就是数据库表的输入,比如用户注册,就可以用 ModelForm。
定义模型
from django.db import models
class User(models.Model):
username = models.CharField(max_length=100)
email = models.EmailField()
password = models.CharField(max_length=100)
定义 ModelForm
from django import forms
from .models import User
class UserForm(forms.ModelForm):
class Meta:
model = User
fields = ["username", "email", "password"]
widgets = {
"password": forms.PasswordInput()
}
在视图里用
def register(request):
if request.method == "POST":
form = UserForm(request.POST)
if form.is_valid():
form.save() # 直接存到数据库
return render(request, "success.html")
else:
form = UserForm()
return render(request, "register.html", {"form": form})
5. 总结
- Form:独立表单,用于登录、搜索等。
- ModelForm:和数据库模型绑定,常用于注册、编辑数据。
- 提供自动渲染、自动验证、自动错误提示,非常适合快速开发。
评论(0)