Django表单使用介绍

📌 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)