Django 表单实战:从 0 到 1 实现用户注册表单(Form/ModelForm 详解)
🌱 前言
在 Django 开发中,表单(Form)是前端与后端数据交互的核心组件,无论是用户注册、登录、留言还是数据提交,都离不开表单。
本文将带你从零搭建一个完整的 Django 用户注册表单,分别使用Form和ModelForm实现,包含完整步骤、代码、路由配置、模板渲染、数据验证与数据库保存,新手也能直接跟着跑通!
📌 一、环境准备
- 安装 Django
pip install django- 创建 Django 项目 + 应用
# 创建项目 django-admin startproject myproject # 进入项目 cd myproject # 创建应用 python manage.py startapp userapp- 在
settings.py中注册应用
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'userapp', # 注册我们的应用 ]📌 二、方式一:使用 Django Form(基础表单)
1. 编写 forms.py
在userapp中新建forms.py:
from django import forms class RegisterForm(forms.Form): # 用户名 username = forms.CharField( min_length=3, max_length=20, label="用户名", error_messages={ "min_length": "用户名最少3位", "max_length": "用户名最多20位" } ) # 密码 password = forms.CharField( widget=forms.PasswordInput, min_length=6, label="密码" ) # 确认密码 repassword = forms.CharField( widget=forms.PasswordInput, label="确认密码" ) # 邮箱 email = forms.EmailField(label="邮箱") # 自定义验证:两次密码一致 def clean(self): cleaned_data = super().clean() pwd = cleaned_data.get("password") repwd = cleaned_data.get("repassword") if pwd and repwd and pwd != repwd: raise forms.ValidationError("两次密码不一致!") return cleaned_data2. 编写视图 views.py
from django.shortcuts import render, HttpResponse from django.views.decorators.http import require_http_methods from .forms import RegisterForm # 注册表单页面 @require_http_methods(["GET", "POST"]) def register(request): if request.method == "GET": form = RegisterForm() return render(request, "register.html", {"form": form}) else: form = RegisterForm(request.POST) if form.is_valid(): data = form.cleaned_data return HttpResponse(f"注册成功!用户名:{data['username']}") else: return render(request, "register.html", {"form": form})3. 配置路由 urls.py
项目总路由myproject/urls.py
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('', include('userapp.urls')), ]应用路由userapp/urls.py(新建)
from django.urls import path from . import views urlpatterns = [ path("register/", views.register, name="register"), ]4. 编写模板 register.html
在userapp中创建文件夹:
templates/userapp/register.html页面代码:
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>用户注册</title> <style> .form{ width: 400px; margin: 50px auto; } .item{ margin-bottom: 15px; } .error{ color:red; font-size:12px; } </style> </head> <body> <div class="form"> <h2>用户注册</h2> <form method="POST"> {% csrf_token %} {% for field in form %} <div class="item"> <label>{{ field.label }}</label> {{ field }} {% if field.errors %} <div class="error">{{ field.errors.0 }}</div> {% endif %} </div> {% endfor %} <button type="submit">注册</button> </form> </div> </body> </html>5. 运行项目
python manage.py runserver访问:
http://127.0.0.1:8000/register/📌 三、方式二:使用 ModelForm(推荐!企业级用法)
ModelForm可以直接关联模型,自动生成字段,自动保存数据库,开发效率极高!
1. 编写模型 models.py
from django.db import models class User(models.Model): username = models.CharField(max_length=20, verbose_name="用户名") password = models.CharField(max_length=100, verbose_name="密码") email = models.EmailField(verbose_name="邮箱") def __str__(self): return self.username2. 编写 ModelForm
from django import forms from .models import User class UserModelForm(forms.ModelForm): # 额外添加确认密码字段 repassword = forms.CharField(widget=forms.PasswordInput, label="确认密码") class Meta: model = User fields = ["username", "password", "email"] widgets = { "password": forms.PasswordInput } # 验证密码 def clean(self): pwd = self.cleaned_data.get("password") repwd = self.cleaned_data.get("repassword") if pwd != repwd: raise forms.ValidationError("两次密码不一致") return self.cleaned_data3. 视图保存数据
@require_http_methods(["GET", "POST"]) def register(request): if request.method == "GET": form = UserModelForm() return render(request, "userapp/register.html", {"form": form}) else: form = UserModelForm(request.POST) if form.is_valid(): form.save() # 直接保存数据库! return HttpResponse("注册成功!数据已保存到数据库") else: return render(request, "userapp/register.html", {"form": form})4. 生成数据表
python manage.py makemigrations python manage.py migrate📌 四、效果展示
- 表单页面自动渲染输入框、标签、错误提示
- 前端实时验证:用户名长度、邮箱格式、密码一致性
- 提交成功后数据写入数据库
- 验证失败不跳转,错误信息直接显示
📌 五、核心知识点总结
- Form:适合无模型、纯验证的简单表单
- ModelForm:适合与数据库交互的表单,自动增删改查
- clean () 方法:自定义表单验证逻辑
- form.is_valid():触发表单验证
- form.cleaned_data:获取验证后的数据
- {% csrf_token %}:Django 必须的安全校验
🎯 六、结语
本文从创建项目 → 表单编写 → 路由配置 → 模板渲染 → 数据库保存完整实现了 Django 表单功能,是 Django 后端开发必须掌握的基础技能。
ModelForm是实际开发中最常用的表单方案,代码简洁、功能强大,建议重点掌握~
持续分享 Django 实战干货!
