Django - Form和ModelForm

一. form介绍

  1.生成页面可用的HTML标签

  2. 提供input可以提交数据

  3. 对用户提交的数据进行校验

  4. 保留上次输入内容

  5. 提供错误信息

二. 普通方式书写注册功能

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>注册页面</title>
</head>
<body>
<form action="/reg/" method="post">{% csrf_token %}<p>用户名:<input type="text" name="name"></p><p>密码:<input type="password" name="pwd"></p><p><input type="submit" value="注册"><p style="color: red">{{ error_msg }}</p></p>
</form>
</body>
</html>
login.html
# 注册
def register(request):error_msg = ""if request.method == "POST":username = request.POST.get("name")pwd = request.POST.get("pwd")# 对注册信息做校验if len(username) < 6:# 用户长度小于6位error_msg = "用户名长度不能小于6位"else:# 将用户名和密码存到数据库return HttpResponse("注册成功")return render(request, "register.html", {"error_msg": error_msg})
Views.py 

三.  使用form组件实现注册功能,自动创建表单

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>注册2</title>
</head>
<body><form action="/reg2/" method="post" novalidate autocomplete="off">{% csrf_token %}<div><label for="{{ form_obj.name.id_for_label }}">{{ form_obj.name.label }}</label>{{ form_obj.name }} {{ form_obj.name.errors.0 }}</div><div><label for="{{ form_obj.pwd.id_for_label }}">{{ form_obj.pwd.label }}</label>{{ form_obj.pwd }} {{ form_obj.pwd.errors.0 }}</div><div><input type="submit" class="btn btn-success" value="注册"></div></form>
</body>
</html>
login2.html

 

先定义好一个RegForm类:
from django import forms
# 按照Django form组件的要求自己写一个类
class RegForm(forms.Form):name = forms.CharField(label="用户名")pwd = forms.CharField(label="密码")再写一个视图函数:
# 使用form组件实现注册方式
def register2(request):form_obj = RegForm()if request.method == "POST":# 实例化form对象的时候,把post提交过来的数据直接传进去form_obj = RegForm(request.POST)# 调用form_obj校验数据的方法if form_obj.is_valid():return HttpResponse("注册成功")return render(request, "register2.html", {"form_obj": form_obj})
Views.py

 

四. form常用的字段和与插件

  创建Form类时,主要涉及到 【字段】 和 【插件】,字段用于对用户请求数据的验证,插件用于自动生成HTML;

  1. 组件  

     视图中:

form_obj = RegForm()   # 实例化form对象
return render(request, 'reg2.html', {'form_obj': form_obj})

 

     模板中:

        form标签加上novalidate 前段不进行校验

{{ form_obj.as_p }}   ——》  生成所有的p标签   label  input
{{ form_obj.errors }}   ——》所有字段的错误
{{ form_obj.user }}   ——》 该字段的input框
{{ form_obj.user.label }}   ——》 该字段的label  中文提示
{{ form_obj.user.id_for_label }}   ——》 该字段的id
{{ form_obj.user.errors }}   ——》 该字段的所有的错误信息
{{ form_obj.user.errors.0 }} ——》 该字段的第一个的错误信息 

  2. 字段

initial:  初始值, input框里面的初始值,默认值

class LoginForm(forms.Form):username = forms.CharField(min_length=8,label="用户名",initial="张三"  # 设置默认值
    )pwd = forms.CharField(min_length=6, label="密码")
View Code

 

  error_messages:  重写错误信息

class LoginForm(forms.Form):username = forms.CharField(min_length=8,label="用户名",initial="张三",error_messages={"required": "不能为空","invalid": "格式错误","min_length": "用户名最短8位"})pwd = forms.CharField(min_length=6, label="密码")
View Code

 

  passwod:  密码

class LoginForm(forms.Form):...pwd = forms.CharField(min_length=6,label="密码",widget=forms.widgets.PasswordInput(attrs={'class': 'c1'}, render_value=True))
View Code

 

  radioSelect:  单radio值为字符串

class LoginForm(forms.Form):username = forms.CharField(min_length=8,label="用户名",initial="张三",error_messages={"required": "不能为空","invalid": "格式错误","min_length": "用户名最短8位"})pwd = forms.CharField(min_length=6, label="密码")gender = forms.fields.ChoiceField(choices=((1, ""), (2, ""), (3, "保密")),label="性别",initial=3,widget=forms.widgets.RadioSelect())
View Code

 

  select

单选select
class LoginForm(forms.Form):...hobby = forms.fields.MultipleChoiceField(choices=((1, "篮球"), (2, "足球"), (3, "双色球"), ),label="爱好",initial=[1, 3],widget=forms.widgets.SelectMultiple())
多选select

 

  checkbox

class LoginForm(forms.Form):...keep = forms.fields.ChoiceField(label="是否记住密码",initial="checked",widget=forms.widgets.CheckboxInput())
单选checkbox
class LoginForm(forms.Form):...hobby = forms.fields.MultipleChoiceField(choices=((1, "篮球"), (2, "足球"), (3, "双色球"),),label="爱好",initial=[1, 3],widget=forms.widgets.CheckboxSelectMultiple())
多选checkbox

 

  关于choise的注意事项:

  在使用选择标签时,需要注意choices的选项可以从数据库中获取,但是由于是静态字段 ***获取的值无法实时更新***,那么需要自定义构造方法从而达到此目的。

from django.forms import Form
from django.forms import widgets
from django.forms import fieldsclass MyForm(Form):user = fields.ChoiceField(# choices=((1, '上海'), (2, '北京'),),initial=2,widget=widgets.Select)def __init__(self, *args, **kwargs):super(MyForm,self).__init__(*args, **kwargs)# self.fields['user'].choices = ((1, '上海'), (2, '北京'),)#self.fields['user'].choices = models.Classes.objects.all().values_list('id','caption')
方式一
from django import forms
from django.forms import fields
from django.forms import models as form_modelclass FInfo(forms.Form):authors = form_model.ModelMultipleChoiceField(queryset=models.NNewType.objects.all())  # 多选# authors = form_model.ModelChoiceField(queryset=models.NNewType.objects.all())  # 单选
方式二

 

 

  3. Django Form所有内置字段

Fieldrequired=True,               是否允许为空widget=None,                 HTML插件label=None,                  用于生成Label标签或显示内容initial=None,                初始值help_text='',                帮助信息(在标签旁边显示)error_messages=None,         错误信息 {'required': '不能为空', 'invalid': '格式错误'}validators=[],               自定义验证规则localize=False,              是否支持本地化disabled=False,              是否可以编辑label_suffix=None            Label内容后缀CharField(Field)max_length=None,             最大长度min_length=None,             最小长度strip=True                   是否移除用户输入空白IntegerField(Field)max_value=None,              最大值min_value=None,              最小值FloatField(IntegerField)...DecimalField(IntegerField)max_value=None,              最大值min_value=None,              最小值max_digits=None,             总长度decimal_places=None,         小数位长度BaseTemporalField(Field)input_formats=None          时间格式化   DateField(BaseTemporalField)    格式:2015-09-01
TimeField(BaseTemporalField)    格式:11:12
DateTimeField(BaseTemporalField)格式:2015-09-01 11:12DurationField(Field)            时间间隔:%d %H:%M:%S.%f...RegexField(CharField)regex,                      自定制正则表达式max_length=None,            最大长度min_length=None,            最小长度error_message=None,         忽略,错误信息使用 error_messages={'invalid': '...'}EmailField(CharField)      ...FileField(Field)allow_empty_file=False     是否允许空文件ImageField(FileField)      ...注:需要PIL模块,pip3 install Pillow以上两个字典使用时,需要注意两点:- form表单中 enctype="multipart/form-data"- view函数中 obj = MyForm(request.POST, request.FILES)URLField(Field)...BooleanField(Field)  ...NullBooleanField(BooleanField)...ChoiceField(Field)...choices=(),                选项,如:choices = ((0,'上海'),(1,'北京'),)required=True,             是否必填widget=None,               插件,默认select插件label=None,                Label内容initial=None,              初始值help_text='',              帮助提示ModelChoiceField(ChoiceField)...                        django.forms.models.ModelChoiceFieldqueryset,                  # 查询数据库中的数据empty_label="---------",   # 默认空显示内容to_field_name=None,        # HTML中value的值对应的字段limit_choices_to=None      # ModelForm中对queryset二次筛选
     
ModelMultipleChoiceField(ModelChoiceField)...                        django.forms.models.ModelMultipleChoiceFieldTypedChoiceField(ChoiceField)coerce = lambda val: val   对选中的值进行一次转换empty_value= ''            空值的默认值MultipleChoiceField(ChoiceField)...TypedMultipleChoiceField(MultipleChoiceField)coerce = lambda val: val   对选中的每一个值进行一次转换empty_value= ''            空值的默认值ComboField(Field)fields=()                  使用多个验证,如下:即验证最大长度20,又验证邮箱格式fields.ComboField(fields=[fields.CharField(max_length=20), fields.EmailField(),])MultiValueField(Field)PS: 抽象类,子类中可以实现聚合多个字典去匹配一个值,要配合MultiWidget使用SplitDateTimeField(MultiValueField)input_date_formats=None,   格式列表:['%Y--%m--%d', '%m%d/%Y', '%m/%d/%y']input_time_formats=None    格式列表:['%H:%M:%S', '%H:%M:%S.%f', '%H:%M']FilePathField(ChoiceField)     文件选项,目录下文件显示在页面中path,                      文件夹路径match=None,                正则匹配recursive=False,           递归下面的文件夹allow_files=True,          允许文件allow_folders=False,       允许文件夹required=True,widget=None,label=None,initial=None,help_text=''GenericIPAddressFieldprotocol='both',           both,ipv4,ipv6支持的IP格式unpack_ipv4=False          解析ipv4地址,如果是::ffff:192.0.2.1时候,可解析为192.0.2.1, PS:protocol必须为both才能启用SlugField(CharField)           数字,字母,下划线,减号(连字符)...UUIDField(CharField)           uuid类型
View Code

 

 

五. 校验

  1. 内置校验

    required=True,min_length=8,max_length=12,

from django.forms import Form
from django.forms import widgets
from django.forms import fields
from django.core.validators import RegexValidatorclass MyForm(Form):user = fields.CharField(validators=[RegexValidator(r'^[0-9]+$', '请输入数字'), RegexValidator(r'^159[0-9]+$', '数字必须以159开头')],)
View Code

 

  2. 自定义校验器

    定义函数

import re
from django.forms import Form
from django.forms import widgets
from django.forms import fields
from django.core.exceptions import ValidationError# 自定义验证规则
def mobile_validate(value):mobile_re = re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$')if not mobile_re.match(value):raise ValidationError('手机号码格式错误')class PublishForm(Form):title = fields.CharField(max_length=20,min_length=5,error_messages={'required': '标题不能为空','min_length': '标题最少为5个字符','max_length': '标题最多为20个字符'},widget=widgets.TextInput(attrs={'class': "form-control",'placeholder': '标题5-20个字符'}))# 使用自定义验证规则phone = fields.CharField(validators=[mobile_validate, ],error_messages={'required': '手机不能为空'},widget=widgets.TextInput(attrs={'class': "form-control",'placeholder': u'手机号码'}))email = fields.EmailField(required=False,error_messages={'required': u'邮箱不能为空','invalid': u'邮箱格式错误'},widget=widgets.TextInput(attrs={'class': "form-control", 'placeholder': u'邮箱'}))
View Code
from django.core.exceptions import ValidationError
def check(value):if 'alex' in value:raise ValidationError('敏感词汇,不符合社会职业核心价值观')
validators=[check]

 

 

 

  3. 局部钩子

    定义一个放法 clean_字段名(self,)的方法,如果不通过校验规则,要抛出异常ValidationError,如果通过校验规则,返回通过校验的值

def clean_user(self):value = self.cleaned_data.get('user')if 'alex' in value:raise ValidationError('敏感词汇,不符合社会职业核心价值观')return value

  4. 全局钩子

    定义一个放法 clean(self)的方法,如果不通过校验规则,要抛出异常ValidationError,还可以自己使用self.add_error('re_pwd', '两次密码不一致!!@!')添加错误信息。如果通过校验规则,返回所有通过校验的值

ef clean(self):pwd = self.cleaned_data.get('pwd')re_pwd = self.cleaned_data.get('re_pwd')if pwd != re_pwd:self.add_error('re_pwd', '两次密码不一致!!@!')raise ValidationError('两次密码不一致')return self.cleaned_data

 

 

ModeForm

通常在Django项目中,我们编写的大部分都是与Django 的模型紧密映射的表单。 举个例子,你也许会有个Book 模型,并且你还想创建一个form表单用来添加和编辑书籍信息到这个模型中。 在这种情况下,在form表单中定义字段将是冗余的,因为我们已经在模型中定义了那些字段。

基于这个原因,Django 提供一个辅助类来让我们可以从Django 的模型创建Form,这就是ModelForm。

 

modelForm定义

form与model的终极结合。

class BookForm(forms.ModelForm):class Meta:model = models.Bookfields = "__all__"labels = {"title": "书名","price": "价格"}widgets = {"password": forms.widgets.PasswordInput(attrs={"class": "c1"}),} 

class Meta下常用参数:

model = models.Book  # 对应的Model中的类
fields = "__all__"  # 字段,如果是__all__,就是表示列出所有的字段
exclude = None  # 排除的字段
labels = None  # 提示信息
help_texts = None  # 帮助提示信息
widgets = None  # 自定义插件
error_messages = None  # 自定义错误信息

 

 

ModelForm的验证

与普通的Form表单验证类型类似,ModelForm表单的验证在调用is_valid() 或访问errors 属性时隐式调用。

我们可以像使用Form类一样自定义局部钩子方法和全局钩子方法来实现自定义的校验规则。

如果我们不重写具体字段并设置validators属性的化,ModelForm是按照模型中字段的validators来校验的。

save()方法

每个ModelForm还具有一个save()方法。 这个方法根据表单绑定的数据创建并保存数据库对象。 ModelForm的子类可以接受现有的模型实例作为关键字参数instance;如果提供此功能,则save()将更新该实例。 如果没有提供,save() 将创建模型的一个新实例:

 

>>> from myapp.models import Book
>>> from myapp.forms import BookForm# 根据POST数据创建一个新的form对象
>>> form_obj = BookForm(request.POST)# 创建书籍对象
>>> new_ book = form_obj.save()# 基于一个书籍对象创建form对象
>>> edit_obj = Book.objects.get(id=1)
# 使用POST提交的数据更新书籍对象
>>> form_obj = BookForm(request.POST, instance=edit_obj)
>>> form_obj.save()

 

转载于:https://www.cnblogs.com/Ryan-Yuan/p/11582082.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/482341.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人工智能,“抛弃”真实数据集?

来源&#xff1a;学术头条当前&#xff0c;人工智能技术已经应用在我们日常生活中的方方面面&#xff0c;比如人脸识别、语音识别、虚拟数字人等。但普遍存在的一个问题是&#xff0c;科研人员要想通过训练一个机器学习模型来执行某一特定任务&#xff08;比如图像分类&#xf…

Django - Cookie和Session

Django - Cookie和Session cookie Django中操作CookieCookie版登陆校验Session Django中Session相关方法Session流程解析Session版登陆验证Django中的Session配置Django - Cookie和Session cookie Cookie的由来 大家都知道HTTP协议是无状态的。 无状态的意思是每次请求都是独立…

一文说清AI智能平台

来源&#xff1a;海豚数据科学实验室有一天&#xff0c;小李的领导说&#xff1a;“我们要做AI平台&#xff01;”。虽然平台产品也不是新概念了&#xff0c;随着AI技术的成熟&#xff0c;AI平台产品也越来越多&#xff0c;但光凭做平台一句话&#xff0c;小李还是犯了难——大…

2D图像转3D仅需5秒,特斯拉的自动驾驶技术有救了?

来源&#xff1a;科技智谷编译&#xff1a;徐浩75年前&#xff0c;宝丽来相机拍摄出第一张即时照片&#xff0c;是人类第一次以逼真的二维图像快速捕捉三维世界&#xff0c;具有划时代的意义。今天&#xff0c;人工智能的研究人员正在进行相反的工作&#xff0c;力求在几秒钟的…

Django - 中间件

Django - 中间件 一. 什么是中间件 官方: 中间件是一个用来处理Django的请求和相应的框架级别的钩子, 他是一个轻量, 低级别的插件系统, 用于在全局范围内改变Django的输入和输出, 每个中间件都负责做一些特定的功能. 大白话: 中间件是帮助我们在视图函数执行之前和执行之后都可…

回答薛定谔问题: 生命是什么?自由能公式

来源&#xff1a;CreateAMind回答薛定谔的问题:自由能公式麦克斯韦詹姆斯德索莫拉姆斯泰德a,b,∗保罗本杰明巴德科克c,d,e,卡尔约翰弗里斯顿f,1加拿大魁北克蒙特利尔麦吉尔大学哲学系加拿大魁北克蒙特利尔麦吉尔大学精神病学系社会和跨文化精神病学分部c墨尔本大学心理科学学院…

AlphaCode能替代人类程序员吗?网友:被替代也挺好,这样就可以少写代码多开会了...

来源&#xff1a;AI前线作者&#xff1a;Ben Dickson译者&#xff1a;王强策划&#xff1a;冬梅本文属于我们的人工智能研究论文评论系列&#xff0c;这个系列旨在探讨人工智能领域的最新研究成果。DeepMind 是最新的人工智能研究实验室。它推出了一个可以生成软件源代码的深度…

Django - 内置admin

Django内置的Admin是对于model中对应的数据表进行增删改查提供的组件&#xff0c;使用方式有&#xff1a; Django内置的Admin是对于model中对应的数据表进行增删改查提供的组件&#xff0c;使用方式有&#xff1a;复制代码依赖APP&#xff1a;django.contrib.authdjango.contri…

Auth认证模块

Auth认证模块 本文目录 1 Auth模块是什么2 auth模块常用方法3 扩展默认的auth_user表回到目录1 Auth模块是什么 Auth模块是Django自带的用户认证模块&#xff1a; 我们在开发一个网站的时候&#xff0c;无可避免的需要设计实现网站的用户系统。此时我们需要实现包括用户注册、用…

2021年图灵奖,花落高性能计算先驱、田纳西大学教授Jack Dongarra

来源&#xff1a;智源社区“我是一个数学家&#xff0c;对我来说&#xff0c;一切都是线性代数&#xff0c;但世界也正在看到这一点,”Jack Dongarra在采访中表示。“这是我们用来建造其它东西的材料。”他说&#xff0c;机器学习和人工智能中的大多数问题都可以追溯到线性代数…

万字深度好文!视觉-语言(VL)智能:任务、表征学习和大型模型

来源&#xff1a;AI科技评论编译&#xff1a;Jocelyn编辑&#xff1a;陈彩娴本文对视觉-语言&#xff08;VL&#xff09;智能按时间顺序进行了全面调研&#xff0c;并将这一领域的发展总结为三个阶段&#xff1a;第一个阶段是2014-2018年&#xff0c;其间&#xff0c;专门的模型…

day60 BBS

BBS项目目的: 带你从头到尾把django再复习一遍 公司开发项目的流程 # 1.需求分析 客户提需求但是并不是完全按照客户需求来 产品经理和架构师开发组组长 去之前架构师和开发组组长 会提前先预想一套方案 有意识的引导客户朝着自己已经想好的解决方案上去提需求 # 2.项目设计 框…

redis笔记_源码_内存分配

文件&#xff1a;zmoalloc.h zmoalloc.c 1.求两个整数的余数 eg: 求_n对sizeof(long)的余数(_n&(sizeof(long)-1)), 性能提升为50%&#xff5e;100% 左右。 转载于:https://www.cnblogs.com/water-bear/p/11598618.html

转发,脑机接口领域又一重要成果!

来源&#xff1a;传感器技术作者&#xff1a;余淼硕士学历&#xff0c;长期从事智能传感控制、信息通信领域研究工作。“ 以脑-机交互&#xff08;BCI&#xff09;为核心的神经工程技术&#xff0c;让人类真正可以做到“心想事成”。据首都医科大学官网报道&#xff0c;首都医科…

《2022城市大脑建设标准研究报告》在京正式发布

2022年3月31号&#xff0c;《2022城市大脑建设标准研究报告》在北京正式发布&#xff0c;该报告由中国指挥与控制学会&#xff0c;中国科学院虚拟经济与数据科学研究中心&#xff0c;国家创新与发展战略研究会数字治理研究中心&#xff0c;天府大数据研究院&#xff0c;远望智库…

PHP7 ini 配置大全

来自书本<<PHP7底层源码设计与实现>> 多图警告⚠️ 转载于:https://www.cnblogs.com/wlphp/p/11600566.html

涌现:21世纪科学的统一主题

来源&#xff1a;medium.com作者&#xff1a;David Pines译者&#xff1a;郭瑞东审校&#xff1a;刘志航、梁金编辑&#xff1a;邓一雪原文题目&#xff1a;Emergence: A unifying theme for 21st century science原文链接&#xff1a;https://medium.com/sfi-30-foundations-f…

福布斯:2022年计算机视觉领域五大发展趋势

来源&#xff1a;科技日报记者&#xff1a;刘霞计算机视觉&#xff08;也被称为机器视觉&#xff09;是人工智能技术最令人兴奋的应用之一。该技术旨在“教”会计算机如何“看”世界&#xff0c;它与自然语言处理及语音识别并列为机器学习领域的三大热点方向。计算机视觉技术囊…

“走近”量子模拟

来源&#xff1a;中国军网作者&#xff1a;张媛、张远、达平当下&#xff0c;量子计算在先进材料以及生物化学模拟方面正崭露头角。因为量子力学解释了这些材料的基本物理特性&#xff0c;量子计算非常适合进行模拟。那么&#xff0c;什么是量子模拟&#xff1f;量子模拟有什么…

redis笔记_源码_简单动态字符串SDS

参照:https://zcheng.ren/sourcecodeanalysis/theannotatedredissourcesds/#sds%E5%B0%8F%E7%BB%93 这里用char buf[] 而不用char* buf 的原因是方便内存释放 转载于:https://www.cnblogs.com/water-bear/p/11611804.html