Django Form表单

django form表单登录注册案例 1-登录注册实现思路 1-创建模型类-------从而映射生成数据表 2-创建登录模板以及注册模板 3-创建视图函数 4-配置路由 总之就是先将架构打好 然后一步一步实现功能 1-登录注册第一步–创建模型生成数据表 1-在注册的APP下面的models.py里面创建模型 from django.db import models # Create your models here. clas... 阅读详情

Form表单

概要

通常情况下,我们需要自自己手动在HTML页面面中,编写form标签和其内的其它元
素。但这费时费力力力,而而且有可能写得不不太恰当,数据验证也比比较麻烦。有鉴于此,Django在内部集成了一个表单模块,专门帮助我们快速处理理表单相关的内容。Django的表单模块给我们提供了了下面面三个主要功能:

  1. 准备和重构数据用于页面面渲染
  2. 为数据创建HTML表单元素
  3. 接收和处理理用用户从表单发送过来的数据

Form相关的对象包括

  • Widget:用用来渲染成HTML元素的部件,如:forms.Textarea对应HTML中的:
    ‘textarea’ 标签

  • Field:Form对象中的一个字段,如:EmailField表示email字段,如果这个字段不不是有效的Email地址格式,就会产生生错误。

  • Form:一系列列Field对象的集合,负责验证和显示HTML元素

  • Form Media:用用来渲染表单的CSS和JavaScript资源。

基本使用

1、使用

Form对象封装了一系列列Field和验证规则,Form类都必须直接或间接继承自django.forms.Form,定义Form有两种方方式:

  • 直接继承Form

    class XXXForm(forms.Form):
    pass
    
  • 结合Model,继承django.forms.ModelForm

    class XXX(models.Model):
    	字段 = models.CharField(max_length=30)
    	字段 = models.CharField(max_length=20)
    class XXXForm(ModelForm):
    	class Meta:
    		model = XXX
    		field = ('字段', '字段')
    # 只显示model中指定的字段
    

2、示例代码

  • models
class Shop(models.Model):
	title = models.CharField('标题', max_length=30)
	content = models.CharField('内容', max_length=20)
class Meta:
	db_table = 'T_SHOP'
  • ModelForm

    class ShopForm(ModelForm):
    	class Meta:
    		model = models.Shop
    		fields = ('title', 'content')# 只显示model中指定的字段
    
  • views

    from django.shortcuts import render
    # Create your views here.
    from .forms import ShopForm
    def add_shop(request):
    	if request.method == "POST":
    	form = ShopForm(request.POST)
    	if form.is_valid():
    	# 所有验证都通过
    	# 处理理表单数据
    	title = form.cleaned_data['title']
    	print(title)
    	# content = form.cleaned_data['content']# 保存数据
    	form.save()
    	return render(request, 'shop/add_shop.html',
    {"shop_form": form})
    	else:
    		form = ShopForm()
    		return render(request, 'shop/add_shop.html', {"shop_form":
    form})
    
  • 模板中使用

    <form action="{% url 'add' %}" method="post">
    	{% csrf_token %}
    	{{ shop_form }}
    	<input type="submit" value="提交"/>
    </form>
    

常用的Field类

  1. 核心字段参数

    参数名说明
    required给字段添加必填属性,不不能空着,若要表示一个字段不是必需的,设置required=False
    labellabel参数用用来给字段添加‘人人类友好’的提示信息。如果没有设置这个参数,那么就用用字段的首首字母大写名字
    label_suffixDjango默认为上面面的label参数后面面加个冒号后缀,如果想自自定义,可以使用用label_suffix 参数
    initial为HTML页面面中表单元素定义初始值。也就是input元素的value参数的值
    widget指定渲染Widget时使⽤的widget类,也就是这个form字
    widget指定渲染Widget时使用用的widget类,也就是这个form字段在HTML⻚页面面中是显示为文文本输入入框?密码输入入框?单
    help_text该参数用用于设置字段的辅助描述文文本
    error_messages该参数允许你覆盖字段引发异常时的默认信息。 传递的是一个字典,其值为你想覆盖的错误信息
    validators指定一个列列表,其中包含了了为字段进行行行验证的函数
    localizelocalize参数帮助实现表单数据输入入的本地化
    disabled设置有该属性的字段在前端页面中将显示为不可编辑状态
    • 核心心字段
BooleanField默认的Widget:CheckboxInput 空值:Flase 规范:Python 的True 或 False。错误信息的键:required
FileField
ModelChoiceField
IntergerField
CharField
ChoiceField
DateField
DateTimeFiled
DecimalField
FloatField
EmailField
ImageField
  • Form常用的属性和方法

    cleaned_data(字典)表单中通过验证的数据form.cleaned_data.get(‘username’)
    changed_data有变换的字段列表form.change_data
    fields表单中字段属性
    is_bound是否绑定
    is_valid()是否通过验证
    errors错误信息
    has_changed()表单数据是否已从初始状态数据更改
    errors.as_json(escape_html)=Flase返回json序列化后的错误信息字典
  • 示例代码

    • forms
    # 用户表单
    class UserForm(forms.Form):
        username = forms.CharField(label='用户名',min_length=3,max_length=30,
                                   error_messages={
                                       'required':'必填',
                                       'min_length':'最少3个字符',
                                       'max_length': '最多30字符',
                                   })
        password_hash = forms.CharField(label='密码',validators=[check_password],min_length=6,max_length=128,widget=forms.PasswordInput(),error_messages={
            'required': '必填',
            'min_length': '最少6个字符',
            'max_length': '最多128字符',
        })
        confirm_password = forms.CharField(label='确认密码',min_length=6,max_length=128,widget=forms.PasswordInput(),error_messages={
            'required': '必填',
            'min_length': '最少6个字符',
            'max_length': '最多128字符',
        })
        sex = forms.ChoiceField(label='性别',choices=[(0,'女'),(1,'男'),(2,'保密')],initial=1,widget=forms.RadioSelect, required=False)
        address = forms.ChoiceField(label='家庭住址',choices=[(1,'北京'),(2,'上海'),(3,'广州'),(4,'深圳')])
        email = forms.EmailField(label='邮箱',required=False,error_messages={
            'invalid':"邮箱格式无效"
        })
        phone = forms.CharField(label='电话',min_length=11,required=False,error_messages={
            'min_length':'至少11位'
        })
        regtime = forms.DateField(label='注册日期',required=False,error_messages={
            'invalid':'日期格式错误'
        })
        usertype = forms.ChoiceField(label='用户类型',choices=[(1,'普通用户'),(2,'管理员')],required=False,initial=1)
    
    
    • views

      def index(request):
          return HttpResponse("首页")
      
      
      def add(request):
          form = StudentForm()  #空的表单,没有数据
          if request.method == 'POST':
              form = StudentForm(request.POST)
              if form.is_valid():  #验证通过
                  print(form.cleaned_data)
                  name = form.cleaned_data.get('name')
                  sex = form.cleaned_data.get('sex')
                  age = form.cleaned_data.get('age')
                  #写入数据库
                  Stuent.objects.create(**form.cleaned_data)
                  #验证成功跳转到首页
                  return redirect(reverse('index'))
          # return render(request,'add.html',context={'form':form})
          # return render(request,'add1.html',context={'form':form})
          # return render(request,'add2.html',context={'form':form})
          return render(request,'add3.html',context={'form':form})
      
      
      def register(request):
          form = UserForm()
          if request.method == 'POST':
              print(request.POST)
              form = UserForm(request.POST)
              if form.is_valid():
                  del form.cleaned_data['confirm_password']
                  value = form.cleaned_data['password_hash']
                  form.cleaned_data['password_hash'] = hashlib.sha1(value.encode('utf8')).hexdigest()
                  print(form.cleaned_data)
                  User.objects.create(**form.cleaned_data)
                  return redirect(reverse('index'))
      
          return render(request,'register.html',context={'form':form})
      
      
      def example(request):
          form = Example()
          if request.method == 'POST':
              form = Example(request.POST)
              if form.is_valid():
                  print(form.cleaned_data)
                  return redirect(reverse('index'))
          return render(request,'example.html')
      
      
      • html

        
        <form action="/add/" method="post">
            {% csrf_token %}
            <div>
                <label for="{{ form.name.id_for_label }}">{{ form.name.label_tag }}</label>
                {{ form.name }}
                {{ form.name.errors }}
            </div>
             <div>
                <label for="{{ form.sex.id_for_label }}">{{ form.sex.label_tag }}</label>
                {{ form.sex }}
                {{ form.sex.errors }}
            </div>
            <div>
                <label for="{{ form.age.id_for_label }}">{{ form.age.label_tag }}</label>
                {{ form.age }}
                {{ form.age.errors }}
            </div>
            <input type="submit">
        </form>
        
        
        
        

#register

  <form action="/register/" method="post">
     {% csrf_token %}
{#    {% include 'renderform.html' %}#}
    {# 渲染隐藏字段 #}
    {% for hidefield in form.hidden_fields %}
        {{ hidefield }}
    {% endfor %}
    {# 渲染可视字段  #}
    {% for field in form.visible_fields %}
        {% if field.html_name == 'sex' %}
            {{ field.label_tag }}
            {% for radio in form.sex %}
                {{ radio.label_tag }}
                {{ radio.tag }}
                {{ radio.choice_label }}
            {% endfor %}
        {% else %}
        <div>
            {{ field.label_tag }}
            {{ field }}
            {{ field.errors }}
        </div>
        {% endif %}
    {% endfor %}
{#    {% for radio in form.sex %}#}
{#        {{ radio.label_tag }}#}
{#        {{ radio.tag }}#}
{#        {{ radio.choice_label }}#}
{#    {% endfor %}#}

    <input type="submit">
</form>

​

重写验证

  • 注意
    • 函数名必须为clean_字段名
    • 必须有返回值
    • 只能拿自己当前的字段值

示例代码

  • 验证单个字段
def check_password(value):
    if re.match(r'\d+$',value):
        raise ValidationError("密码不能是纯数字")
        
  • 类方法实现

      class UserForm(forms.Form):
            def clean_phone(self):
            	value = self.cleaned_data.get('phone')
            	if not re.match(r"^1[35678]\d{9}$", value):
               	 	raise ValidationError("手机号码不正确,请重新填写")
            	else:
               	 	return value
    
  • 验证两个变单数据的一致

     def clean(self):
    
            password1 = self.cleaned_data.get("password_hash")
    
            password2 = self.cleaned_data.get("confirm_password")
            print(password1,password2)
            if password1 != password2:
                raise ValidationError("两次密码不一致")
            else:
                return self.cleaned_data
    
    

    **注意事项:**对于

    标签中
    {{ form.as_ul }} 将它们渲染在

  • 标签中
    注意,你必须自自己己提供 或
    • 元素。
python django Form表单 Django 拥有自己独立的表单功能块,可以完成:   1、表单的定义   2、表单的校验   3、表单的前端样式 等功能,方便我们开发,那么接下来,我们看一下表单的定义 首先我们确定我们要编写的功能,一个提供给博客的访客发送自己的联系方式的功能。并且搭建相对应的数据库 1 from django.db import models 2 3 class Connection(mode... 阅读详情

相关推荐

SCI、中科院1区算法应用:(BWO-CNN-BiGRU-Attention)白鲸优化深度学习-融合注意力机制预测程序代码!包含特征可视化,数据Excel导入,直接运行!

BWO 白鲸优化算法,于2022年发表在SCI、中科院1区期刊《Knowledge-Based Systems》上。我们利用该高创新算法对我们的CNN-BiGRU-Attention时序和空间特征结合-融合注意力机制的回归预测程序代码中的超参数进行优化。

weixin_48747334的博客 3263

Python开发-Django国际化和本地化

国际化和本地化的目标是让同一站点为不同的用户提供定制化的语言和格式服务.Django 完整支持 翻译文本, 格式化日期,时间和数字 以及 时区。

huidaoli 3004

详解Nacos集群搭建

在我们日常的开发当中,用的都是单点Nacos,这种模式,我们自己开发测试玩一玩还可以,但是到了企业的生产环境之下,你还这么玩的话,那肯定是要出大问题了。因为在企业当中,我们更加强调的是高可用,所以在企业的生产环境下,Nacos一定要做成个集群。

博客 1万+

Django Widgets:表单字段的HTML控件实现详解​

Django表单系统中​​Widget(控件)​​的核心作用与实现机制,从基础概念、内置控件类型到自定义开发方法,全面讲解如何通过Widget控制表单字段的HTML渲染与交互逻辑。

YAnt的博客 740

糖果【贪心】

【问题描述】 有N(1≤N <100,000)N(1≤N~<100,000)N(1≤N <100,000)种不同类型的糖果,每种糖果数量无限多。第i种糖果每颗的价格是Pi(1≤Pi≤1018),有Ci(1≤Ci≤1018)P_i(1≤P_i≤10^{18}),有C_i (1≤C_i≤10^{18)}Pi​(1≤Pi​≤1018),有Ci​(1≤Ci​≤1018)头牛想吃这种糖果。 FarmerJohnFarmer JohnFarmerJohn拥有金钱BBB元(1≤B≤1

算法小猪的博客 795

Rocfall安装包&安装教程

Rocfall 第一步:下载安装包 下载路径: 链接:https://pan.baidu.com/s/1Dzvxzv67dSPRi7f7ZT9EeA 提取码:o9pl 第二部:安装 安装包解压 选择part1进行解压 点击Setup.exe启动安装 生成Serial Number 替换启动程序 安装完毕 素材来源于网络(禁止用于商业仅用于完成毕业设计和研究使用) 谢谢! ...

cym的博客 8702

Django 在保存数据时比较字段的新旧值

如果是前后端不分离项目,利用ModelForm的自带属性很容易做到: self.data:传递给表单的实际数据。 self.cleaned_data:验证后清除的数据,包含有资格保存在模型中的数据 self.changed_data:已更改的字段列表。 如果没有任何变化,它将为空 如果是前后端分离项目,可以使用以下方法来实现: 像这样在模型对象初始化时,记住模型属性值: class BaseModel(models.Model): id = models.UUIDField(defau

bocai_xiaodaidai的博客 1051

STM32独立实现CANOpen主机功能:从零构建轻量级控制方案

本文详细介绍了如何在STM32上不依赖CanFestival库,从零构建一个轻量级的CANOpen主机方案。文章深入剖析了CANOpen主机的三大核心功能——NMT网络管理、SDO参数配置与PDO过程数据交换,并提供了从硬件准备、驱动层构建到协议实现的完整代码实战。该方案代码精简,资源占用低,特别适合在资源受限的STM32平台上实现工业控制、电机驱动等场景的稳定通信。

potato的博客 1072

Django——ORM数据库的配置(以MySQL为例)、模型对应关系、Form表单

Django默认使⽤的是sqlite,但在⽣产环境中⼀般会⽤mysql、postgrsql、oracle 等关系型数据库。本文简单介绍在django中对于关系型数据库的一些用法。

weixin_50517509的博客 1381

MIKE水动力笔记1_岸线及水深数据之依靠全球数据库资源提取的方法

通过各种数据库资源来获取全球岸线及水深数据,这种方法获取的岸线及水深数据精度偏低,比较适合大尺度范围的水动力研究。

晏长街的博客 1万+

ABAP 里的 XML 与 JSON 处理,一套从接口落地到 Clean Core 的完整参考

ABAP 里的 XML 和 JSON 处理并不只是几段工具类调用。iXML、sXML、、XCO、、code page conversion、GZIP、对象序列化,这些能力背后对应的是不同的数据规模、访问模式、接口契约和运行时边界。小报文、复杂树结构、需要修改节点,iXML 很顺手。大报文、顺序读写、内存敏感,sXML 更可靠。ABAP 结构和 XML、JSON 之间要做标准转换,是主干。现代 JSON API、ABAP Cloud、命名转换,XCO 值得优先考虑。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 224

Django框架admin管理页面中,记录每个字段数据修改变更,特定字段变更执行特定动作

Django框架admin管理页面中,记录每个字段数据修改变更,特定字段变更执行特定动作

czwhit的博客 1478

OpenClaw 多代理协同工作模式配置指南

OpenClaw 采用。

形上得其象,形下合于数;阴阳自济,玄理自明。 1万+

Django-form表单

Widget:用来渲染成HTML元素的工具,如:forms.Textarea对应HTML中的<textarea>标签Field:Form对象中的一个字段,如:EmailField表示email字段,如果这个字段不是有效的email格式,就会产生错误。Form:一系列Field对象的集合,负责验证和显示HTML元素Form Media:用来渲染表单的CSS和JavaScript资源。subject = forms.CharField(max_length=100 ,label='留言标题')

happy_king_zi的博客 2049

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Django之form表单

Django之form表单 Django的请求 默认页面请求都是get请求 Request是传递到视图的请求,里面包含请求的各种参数: 常用的请求方式: Get:默认是get请求,请求数据以明文形式放在路由上,get的格式是以?开头,键等于值的形式,以&来分割键值对,通常用于和服务器获取资源。 Post:请求数据隐藏发送,安全系数更高。通常用于向服务器提交资源。 Django默认提供了...

零度面北的博客 712

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Django之Form表单

在Django中有一个验证神器,那就是Form表单,它会自动生成你所需要的表单内容,并自动为你验证是否正确,并可以返回错误的详细信息(前提是你写的详细)。 Django中的Form使用时一般有两种功能: 1、生成html标签 2、验证输入内容 接下来我介绍下Django模板中的表单和form表单的区别、 1. Django模板中的表...

Gscsd的博客 1272

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

django中的form表单和form表单类以及表单检测

目录 form表单 一、get方式 1、编写前端页面 ​ 2、修改视图文件 3、修改路由 4、修改前端代码 5、查看效果 二、POST方式 1、编写前端代码 2、修改视图文件 3、查看效果 form表单类 1、在app当中创建一个forms.py脚本 (1)手动定义 (2)继承 2、修改views文件 3、修改urls文件 4、编写前端 5、查看效果 fo...

李嘉豪的博客 1517

Django中的Form表单

Django-Form表单 继承 django.forms.Form 可以通过 django.forms 定义表单属性 Form 的用途 生成表单页面 (不常用) 验证数据 Form 表单的配置步骤 在 应用下、新建一个 forms.py, 在该模块下,定义当前应用下的 表单类 from django import forms class ResourceCommentForm(forms.Form): # 表单中的属性,要和 提交的属性保持一致 star = forms.I

人生苦短,我用python 2308

Django form 表单校验

Django form 表单类 ,表单可以提交数据,也可做校验 校验的方式: (1):前端校验: 开发难度低,但是不能完全防止错误数据,因为有些请求是可以不经过网页。 所以一个安全的注册需要前后端的校验 (2): 后端校验: i>最...

石马的农的博客 370

Django教程--Form表单

Django教程–Form表单 前面我们已经了解如何在django中使用GET、POST传递数据,但是我们并没有对用户提交的数据进行验证(为何需要验证大家都懂得),对于验证我们可以自己写相关代码进行判断(最基本也有效的方法),但是django作为一个集大成的全面框架,为我们提供了一种更优雅简单的方式,那就是今天的主角–Form,Form不仅仅具有数据验证功能,还可以生成用于提交的html标签,接

a582816317的博客 1173

Django 之form表单

Django 之form表单补充 1. form组件 1. 能做什么事? 1. 能生成HTML代码 input框 2. 可以校验数据 3. 保留输入的数据 4. 有错误的提示 2. 定义form form django import forms...

wahaha 456

Django form表单类

前端校验与后端校验 表单功能在开发的过程当中有一半的需求是获取数据,另一半校验数据。 前端校验:就是通过js或者jq脚本对form表单输入的数据进行校验,形象,直观,有利于对用户进行提醒,用户体验好。 后端校验:就是在视图当中或者python后端当中对提交的数据进行校验,比较安全。 django的表单校验 前端校验我们可以通过各种校验框架进行校验,django推出了自己的form...

qq_39112101的博客 572

Django——form表单

表单是搜集用户数据信息的各种表单元素的集合,其作用是实现网页上的数据交互,比如用户在网站输入数据信息,然后提交到网站服务器端进行处理(如数据录入和用户登录注册等)。 网页表单是Web开发的一项基本功能,Django的表单功能由 Form 类实现,主要外为两种:diango.forms.Form 和 django.forms.Modellorm,前者是一个基础的表单功能,后者是在前者的基础上结合模型所生成的数据表单。 接下来带各位了解一下表单 传统的表单生成方式是在模板文件中编写 HTML 代码实现,在 H

Erudite_x的博客 427

Django form表单(状态保持session、form表单及注册实现)

一、状态保持 session   状态保持 #1、http协议是无状态的:每次请求都是一次新的请求,不会记得之前通信的状态 #2、客户端与服务器端的一次通信,就是一次会话实现状态保持的方式:在客户端或服务器端储存与会话有关的数据 #3、储存方式包括cookie、session,会话一般指session #4、使用cookie,所有数据存储在客户端,注意不要存储敏感数据 #5、是由sess...

平头哥(Adger)的博客 1322

Django的form表单

Django form 的作用 Django自带的form表单主要是为了做校验数据。 并且它可以返回任何你想要在form表单中展示的信息。 也可以返回详细的出错信息。 下面以一个简单的登录页面举例 1、在APP目录下面创建一个.py文件,用于存放form表单(我这里创建的是forms.py) form django import forms class LoginForm(forms.Fo...

小杨的博客 245
上一篇: pyenv管理虚拟环境
下一篇: 上传文件
Are you ready
博客等级 码龄8年 312粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值