每天40分玩转Django:Django表单

news/2024/12/17 6:44:14/

Django表单

一、今日学习内容概述

学习模块重要程度预计学时
表单基础与创建⭐⭐⭐⭐⭐1.5小时
表单验证机制⭐⭐⭐⭐⭐2小时
CSRF保护机制⭐⭐⭐⭐⭐1.5小时
表单渲染与处理⭐⭐⭐⭐1小时

二、Django表单基础知识

Django的表单处理是Web应用程序中最重要的部分之一,它提供了一种方便的方式来处理用户输入数据。表单不仅包括HTML表单,还包括验证逻辑和数据处理逻辑。

2.1 创建表单类

让我们通过一个实际的例子来学习Django表单。假设我们要创建一个用户注册表单:

python"># forms.py
from django import formsclass UserRegistrationForm(forms.Form):username = forms.CharField(label='用户名',max_length=100,widget=forms.TextInput(attrs={'class': 'form-control','placeholder': '请输入用户名'}))email = forms.EmailField(label='电子邮件',widget=forms.EmailInput(attrs={'class': 'form-control','placeholder': '请输入邮箱'}))password = forms.CharField(label='密码',min_length=6,widget=forms.PasswordInput(attrs={'class': 'form-control','placeholder': '请输入密码'}))confirm_password = forms.CharField(label='确认密码',min_length=6,widget=forms.PasswordInput(attrs={'class': 'form-control','placeholder': '请再次输入密码'}))def clean(self):cleaned_data = super().clean()password = cleaned_data.get('password')confirm_password = cleaned_data.get('confirm_password')if password and confirm_password and password != confirm_password:raise forms.ValidationError('两次输入的密码不匹配')return cleaned_data

2.2 视图处理表单

python"># views.py
from django.shortcuts import render, redirect
from django.contrib import messages
from .forms import UserRegistrationFormdef register(request):if request.method == 'POST':form = UserRegistrationForm(request.POST)if form.is_valid():# 获取清理后的数据cleaned_data = form.cleaned_data# 这里可以添加用户注册逻辑messages.success(request, '注册成功!')return redirect('login')else:form = UserRegistrationForm()return render(request, 'registration/register.html', {'form': form})

2.3 模板展示表单

<!-- templates/registration/register.html -->
{% extends 'base.html' %}{% block content %}
<div class="container mt-5"><div class="row justify-content-center"><div class="col-md-6"><div class="card"><div class="card-header"><h3 class="text-center">用户注册</h3></div><div class="card-body"><form method="post" novalidate>{% csrf_token %}{% if form.non_field_errors %}<div class="alert alert-danger">{% for error in form.non_field_errors %}{{ error }}{% endfor %}</div>{% endif %}{% for field in form %}<div class="form-group mb-3">{{ field.label_tag }}{{ field }}{% if field.errors %}<div class="alert alert-danger mt-1">{{ field.errors }}</div>{% endif %}</div>{% endfor %}<button type="submit" class="btn btn-primary w-100">注册</button></form></div></div></div></div>
</div>
{% endblock %}

三、表单验证机制

Django的表单验证分为多个层次:

  1. 字段级验证
  2. 表单级验证
  3. 自定义验证器

3.1 字段级验证

python"># forms.py
from django import forms
import redef validate_chinese_phone(value):pattern = r'^1[3-9]\d{9}$'if not re.match(pattern, value):raise forms.ValidationError('请输入有效的中国手机号码')class ContactForm(forms.Form):name = forms.CharField(min_length=2,max_length=50,error_messages={'required': '姓名不能为空','min_length': '姓名长度不能小于2个字符','max_length': '姓名长度不能超过50个字符'})phone = forms.CharField(validators=[validate_chinese_phone],error_messages={'required': '手机号码不能为空'})def clean_name(self):name = self.cleaned_data['name']if name.isdigit():raise forms.ValidationError('姓名不能为纯数字')return name

3.2 表单级验证

python">def clean(self):cleaned_data = super().clean()name = cleaned_data.get('name')phone = cleaned_data.get('phone')# 示例:检查特定组合条件if name and phone:if name.lower() in phone:raise forms.ValidationError('手机号码不能包含姓名')return cleaned_data

四、CSRF保护机制

CSRF(Cross-Site Request Forgery)跨站请求伪造是一种常见的Web安全漏洞。Django内置了CSRF保护机制。

4.1 CSRF中间件配置

python"># settings.py
MIDDLEWARE = ['django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.CommonMiddleware','django.middleware.csrf.CsrfViewMiddleware',  # CSRF中间件...
]

4.2 CSRF令牌使用

在模板中使用CSRF令牌:

<form method="post">{% csrf_token %}<!-- 表单字段 -->
</form>

对于AJAX请求,需要在请求头中包含CSRF令牌:

// 获取CSRF令牌
const csrftoken = document.querySelector('[name=csrfmiddlewaretoken]').value;// 发送AJAX请求
fetch('/api/endpoint/', {method: 'POST',headers: {'X-CSRFToken': csrftoken,'Content-Type': 'application/json',},body: JSON.stringify(data)
})

五、ModelForm使用

ModelForm是Django提供的一种特殊表单类,它可以直接从模型创建表单。

python"># models.py
from django.db import modelsclass Article(models.Model):title = models.CharField(max_length=200, verbose_name='标题')content = models.TextField(verbose_name='内容')published_date = models.DateTimeField(auto_now_add=True, verbose_name='发布时间')class Meta:verbose_name = '文章'verbose_name_plural = verbose_name# forms.py
from django.forms import ModelForm
from .models import Articleclass ArticleForm(ModelForm):class Meta:model = Articlefields = ['title', 'content']widgets = {'title': forms.TextInput(attrs={'class': 'form-control'}),'content': forms.Textarea(attrs={'class': 'form-control'})}error_messages = {'title': {'required': '标题不能为空','max_length': '标题长度不能超过200个字符'},'content': {'required': '内容不能为空'}}

六、表单处理流程图

在这里插入图片描述

七、表单高级特性

7.1 动态表单字段

python">class DynamicForm(forms.Form):def __init__(self, *args, **kwargs):extra_fields = kwargs.pop('extra_fields', {})super().__init__(*args, **kwargs)for field_name, field_type in extra_fields.items():self.fields[field_name] = field_type

7.2 表单集(Formset)使用

python">from django.forms import formset_factoryclass ItemForm(forms.Form):name = forms.CharField(max_length=100)quantity = forms.IntegerField(min_value=0)# 创建表单集
ItemFormSet = formset_factory(ItemForm, extra=2, max_num=10)# 视图中使用
def manage_items(request):if request.method == 'POST':formset = ItemFormSet(request.POST)if formset.is_valid():for form in formset:if form.cleaned_data:# 处理每个表单的数据passelse:formset = ItemFormSet()return render(request, 'manage_items.html', {'formset': formset})

八、常见问题与解决方案

  1. 表单验证失败但没有显示错误信息

    • 确保在模板中正确显示错误信息
    • 检查表单的clean方法是否正确抛出ValidationError
  2. CSRF验证失败

    • 检查是否包含csrf_token
    • 确认CSRF中间件已启用
    • 检查会话cookie是否正常工作
  3. 文件上传失败

    • 确保表单包含enctype=“multipart/form-data”
    • 检查文件大小是否超过限制
    • 验证文件类型是否允许

九、今日总结

  1. 学习了Django表单的基本概念和创建方法
  2. 掌握了表单验证机制和自定义验证方法
  3. 理解了CSRF保护的重要性和实现方式
  4. 学习了ModelForm的使用和表单集的高级特性

十、练习任务

  1. 创建一个包含文件上传的表单,实现图片预览功能
  2. 实现一个动态生成字段的表单,并添加相应的验证规则
  3. 使用表单集实现一个订单系统的表单,包含多个商品项
  4. 为表单添加自定义的JavaScript验证和实时反馈

怎么样今天的内容还满意吗?再次感谢朋友们的观看,关注GZH:凡人的AI工具箱,回复666,送您价值199的AI大礼包。最后,祝您早日实现财务自由,还请给个赞,谢谢!


http://www.ppmy.cn/news/1555795.html

相关文章

Ansible 简介及常用命令 安装部署tomcat -单机版

Ansible 是一个开源的自动化配置管理工具&#xff0c;用于应用程序部署、任务执行和多节点管理。它的目标是简化和自动化 IT 基础设施管理和配置工作。通过使用 Ansible&#xff0c;系统管理员可以有效地管理数以百计的服务器&#xff0c;而无需依赖复杂的脚本或安装额外的代理…

ISP帳戶會記錄什麼資訊?

許多用戶並不知道ISP會記錄有關線上活動的大量資訊。從流覽歷史記錄到數據使用情況&#xff0c;ISP經常收集和保留用戶數據&#xff0c;引發一系列隱私問題。 ISP 記錄哪些數據&#xff1f; ISP可以根據其隱私政策記錄各種類型的資訊。常見的記錄數據包括&#xff1a; 1.流覽…

AJAX家政系统自营+多商家家政系统服务小程序PHP+Uniapp

一款同城预约、上门服务、到店核销家政系统&#xff0c;用户端、服务端、门店端各端相互依赖又相互独立&#xff0c;支持选择项目、选择服务人员、选择门店多种下单方式&#xff0c;支持上门服务和到店核销两种服务方式&#xff0c;支持自营和多商家联营两种运营模式&#xff0…

游戏引擎学习第51天

仓库&#xff1a; https://gitee.com/mrxiao_com/2d_game 总结 目前&#xff0c;已经实现了一个基本的碰撞检测器&#xff0c;虽然它能够让角色沿着墙壁滑动&#xff0c;但它并没有完全实现需要的功能。角色可以在空间中自由移动&#xff0c;但目前并没有交互作用&#xff0c…

试题转excel;word转excel;大风车excel

一、问题描述 一名教师朋友&#xff0c;偶尔会需要整理一些高质量的题目到excel中 以往都是手动复制搬运&#xff0c;几百道题几乎需要一个下午的时间 关键这些事&#xff0c;枯燥无聊费眼睛&#xff0c;实在是看起来就很蠢的工作 就想着做一个工具&#xff0c;可以自动处理…

Bugku---misc---隐写2

题目出处&#xff1a;首页 - Bugku CTF平台 ✨打开发现是一张图片&#xff0c;于是查看属性&#xff0c;放在010查看&#xff0c;这都是基本步骤了&#xff0c;发现里面有一个flag.rar&#xff01;&#xff01;&#xff01;拿binwalk分析也确实存在 ✨于是按照压缩包的起始位置…

ubuntu服务器木马类挖矿程序排查、及安全管理总结

版本 24.04 由于GPU多卡服务器多人使用&#xff0c;需要链接隧道ssh等&#xff0c;容易中招挖矿脚本。 总的思路是&#xff0c;顺着进程的PID回溯最终的程序运行起点&#xff0c;这里可以先看一下日志&#xff1a; journalctl -u PID 通过 PID 精确定位进程的信息&#xff0c…

(Windows系统)详细介绍Windows系统 含有英文版

在上期中小亦为大家介绍了MacOS系统&#xff0c;这期小亦就带大家继续详细介绍一下&#xff0c;大家熟知的Windows&#xff0c;话不多说~ Windows系统详细介绍 Windows操作系统&#xff0c;作为微软公司&#xff08;Microsoft&#xff09;的旗舰产品&#xff0c;自1985年问世以…