当前位置: 首页 > news >正文

Django 表单实战:从 0 到 1 实现用户注册表单(Form/ModelForm 详解)


🌱 前言

在 Django 开发中,表单(Form)是前端与后端数据交互的核心组件,无论是用户注册、登录、留言还是数据提交,都离不开表单。

本文将带你从零搭建一个完整的 Django 用户注册表单,分别使用FormModelForm实现,包含完整步骤、代码、路由配置、模板渲染、数据验证与数据库保存,新手也能直接跟着跑通!


📌 一、环境准备

  1. 安装 Django
pip install django
  1. 创建 Django 项目 + 应用
# 创建项目 django-admin startproject myproject # 进入项目 cd myproject # 创建应用 python manage.py startapp userapp
  1. 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_data

2. 编写视图 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.username

2. 编写 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_data

3. 视图保存数据

@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

📌 四、效果展示

  1. 表单页面自动渲染输入框、标签、错误提示
  2. 前端实时验证:用户名长度、邮箱格式、密码一致性
  3. 提交成功后数据写入数据库
  4. 验证失败不跳转,错误信息直接显示

📌 五、核心知识点总结

  1. Form:适合无模型、纯验证的简单表单
  2. ModelForm:适合与数据库交互的表单,自动增删改查
  3. clean () 方法:自定义表单验证逻辑
  4. form.is_valid():触发表单验证
  5. form.cleaned_data:获取验证后的数据
  6. {% csrf_token %}:Django 必须的安全校验

🎯 六、结语

本文从创建项目 → 表单编写 → 路由配置 → 模板渲染 → 数据库保存完整实现了 Django 表单功能,是 Django 后端开发必须掌握的基础技能。

ModelForm是实际开发中最常用的表单方案,代码简洁、功能强大,建议重点掌握~

持续分享 Django 实战干货!

http://www.jsqmd.com/news/675146/

相关文章:

  • 别再傻傻用typeid判断类型了!C++运行时类型识别(RTTI)的完整指南与实战避坑
  • Typora Markdown写作助手:集成GLM-4.7-Flash实现智能排版
  • Phi-3.5-mini-instruct多场景落地:教育机构AI助教系统建设实践
  • 预算为0也能上系统?揭秘私藏的5个“零成本”数字化神器
  • real-anime-z企业应用:品牌IP延展——从LOGO生成配套动漫风格VI素材
  • 《不花一分钱,让你的QClaw在Mac上跑得比云端还快》
  • Qianfan-OCR惊艳效果:手写体混合印刷体合同中签名区域+条款文本分离展示
  • 【限时首发|Loom安全迁移黄金72小时】:20年JVM专家手把手带你完成存量Spring Boot项目响应式重构+全链路安全加固(含自动化检测脚本)
  • 别再拍脑袋估工时了!用FPA功能点分析法,像东北电网那样精准评估软件开发工作量
  • real-anime-z新手误区纠正:不是步数越高越好,12步+LoRA强度1.0更高效
  • 易基因: Nat Plants:南科大朱健康/华中农大赵伦团队aChIP-seq+WGBS表观多组学揭示ROS1调控DNA去甲基化新机制
  • Phi-3.5-mini-instruct开源可部署:提供完整Dockerfile与K8s Helm Chart模板
  • [特殊字符] EagleEye效果实测:20ms内完成1080P图像检测的完整性能报告
  • NaViL-9B效果对比评测:vs Qwen-VL、InternVL在中文图文任务表现
  • 2026直埋保温管厂家推荐排行榜产能与专利双优企业领衔 - 爱采购寻源宝典
  • unity_vuforia_ar—-识别地面
  • AI人体骨骼检测保姆级教程:3步完成部署,轻松绘制骨骼连线图
  • Phi-3.5-mini-instruct部署案例:4090单卡同时运行3个实例实测
  • Moody’s Corporation任命Christina Kosmowski出任Moody’s Analytics首席执行官
  • 零代码 AI 短剧带货系统:7 天快速上线,撬动电商变现新风口
  • 知识图谱(BILSTM+CRF项目完整实现、训练结果优化方向(面试))【第八章】
  • Bamtone班通_Bamtone F系列:PCB全尺寸飞拍影像测量首选
  • 从外包到FAANG:简历优化的三个魔鬼细节
  • 2026保温管厂家推荐排行榜产能、专利、质量三维度权威对比 - 爱采购寻源宝典
  • 仅限头部云厂商解密的Java 25虚拟线程监控体系(Arthas+Micrometer+OpenTelemetry三合一埋点规范)
  • nli-MiniLM2-L6-H768完整指南:极速加载、秒级推理、100%离线隐私保障
  • golang如何使用sync.WaitGroup_golang sync.WaitGroup并发等待使用方法
  • 营养标签强制标示升级为7项,标签打印软件如何辅助食品企业高效改版
  • 2026年热门的配方头销弓形卸扣/带保险弓形卸扣横向对比厂家推荐 - 品牌宣传支持者
  • NumPy进阶:np.where()返回的坐标元组怎么用?手把手教你定位与操作矩阵元素