今日内容
<p>forms组件渲染标签的方式1</p>
{{ form_obj.as_p }}
{{ form_obj.as_table }
{{ form_obj.as_ul }}
'''封装程度高 扩展性差 主要用于本地测试'''
<p>forms组件渲染标签的方式2</p>
<p style="color: red">label标签和form分开写</p>
{{ form_obj.username.label }}
{{ form_obj.username }}
{{ form_obj.age.label }}
{{ form_obj.age }}
{{ form_obj.email.label }}
{{ form_obj.email }}
'''封装程度过低 扩展性高 编写麻烦'''
<p>forms组件渲染标签的方式3</p>
{% for form in form_obj %}
{{ form.label }}
{{ form }}
{% endfor %}
'''封装程度较高 扩展性高 编写简单 推荐使用'''
forms组件只负责渲染获取用户数据的标签 form标签和按钮都需要自己写
前端的校验可以随意更改 最终都需要后端校验 在使用forms组件的时候可以直接取消前端帮我们的校验
<form action="" novalidate>
后端不同请求返回的forms对象一定要是相同的变量名
def ad_forms_func(request):
#1.产生一个空对象
form_obj = MyForm()
if request.method == 'POST':
form_obj=MyForm(request.POST)
#requestPOST可以看成是一个字典 直接传给forms类进行校验 字典中无论有多少键值对都没关系 只在乎类中编写的
if form_obj.is_valid():#判断数据是否合法
print(form_obj.cleaned_data)
else:
print(form_obj.errors)
#2.将该对象传递给html页面
return render(request,'formsPage.html',locals())
<form action="" method="post" novalidate>
{% for form in form_obj %}
<p>
{{ form.label }}
{{ form }}
<span>{{ form.errors.0 }}</span> #固定这样写
</p>
给字段添加error_messages参数
error_messages={'max_length':'用户名最多8个字',
'min_length':'用户名最少两个字',
'required':'用户名不能为空',
}
error_messages={'required':'邮箱不能为空',
'invalid':'邮箱格式不对'}
from django.conf import global_settings
改成简体中文
forms组件针对字段数据的校验 提供了三种类型的校验方式(可以一起使用)
直接填写函数:直接填写参数 max_length
使用正则表达式: validators
from django.core.validators import RegexValidator
phone = forms.CharField(validators= [RegexValidator(r'^[0-9]+$','请输入数字'),
RegexValidator(r'^159[0-9]+$','数字必须是以159开头')
''' 每个字段都可以加validators字段
可以写多个RegexValidator参数 '''
钩子函数 编写代码自定义校验规则
在类中编写函数
class MyForm(forms.Form):
username = forms.CharField(max_length=8, min_length=2, label='用户名')
#局部钩子
def clean_username(self):
username = self.cleaned_data.get('username')
if username == 'jason':
self.add_error('username','用户名jason已存在')
return username
#全局钩子
def clean(self):
password=self.cleaned_data.get('password')
confirm_pwd = self.cleaned_data.get('confirm_pwd')
if not password == confirm_pwd:
self.add_error('confirm_pwd','两次密码不一致')
return self.cleaned_data
#钩子函数>>>:数据已经通过上述校验以后 相当于最后一个关卡 在所 有的校验参数之后触发
#局部钩子:每次只校验一个字段数据 校验用户是否已存在
#全局钩子:一可以校验多个字段数据 校验两次密码是否一致
'''
注意:拿什么就要返回什么 拿所有返回所有
'''
min_length 最小字符
max_length 最大字符
min_value 最小值
max_value 最大值
label 字段注释
error_messages 错误提示
validators 正则校验器
initial 默认值
required 是否必填
widget 控制标签的各项属性
切入口:form_obj.is_valid()
'''
我们学习校验型组件的目的 绝大部分是为了数据录入数据库之前的各项审核forms组件使用的时候需要对照模型类编写代码 不够方便
'''
from django import forms
from app01 import models
class MyModelForm(forms.ModelForm):
class Meta:
model = models.UserInfo
fields = '__all__'
labels = {
'username':'用户名'
}
def ab_mf_func(request):
modelform_obj = MyModelForm()
if request.method == 'POST':
modelform_obj = MyModelForm(request.POST,instance=User_obj)
if modelform_obj.is_valid():
modelform_obj.save() # models.UserInfo.objects.create(...)/update(...)
else:
print(modelform_obj.errors)
return render(request, 'modelFormPage.html', locals())
django默认有七个中间件 并且还支持用户自定义中间件
中间件主要可以用于:网站访问频率的校验 用户权限的校验等全局类型的功能需求
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
如何自定义中间件
1.创建存储自定义中间件代码的py文件或者目录(如果中间件很多)
2.参考自带中间件的代码编写类并继承
3.在类中编写五个可以自定义的方法
需要掌握的
process_request
1.请求来的时候会从上往下依次经过每一个注册了的中间件里面的该方法 如果没有则直接跳过
2.如果该方法自己返回了HttpResponse对象那么不再往后执行而是直接原路返回
process_response
1.响应走的时候会从下往上依次经过每一个注册了的中间件里面的该方法 如果没有则直接跳过
2.该方法有两个先request和response 形参response指代的就是后端想要返回给前端浏览器的数据 该方法必须返回该形参 也可以替换
'''如果在执行process_request方法的时候直接返回了HttpResponse对象那么会原路返回执行process_response 不是执行所有'''
需要了解的
process_view
process_exception
process_template_response
4.一定在配置文件中注册中间件才可以生效
作者|梁唐大家好,我是梁唐。这是EasyC++系列的第66篇,来聊聊友元函数。友元函数我们知道C++控制对象的私有部分的访问,只能通过公共的接口。这样的设计当然没错,但有的时候也会显得过于严格,产生一些问题。因此C++提供了另外一种形式的访问权限,叫做友元(friend)。友元有三种,分别是友元函数、友元类和友元成员函数。通过让函数成为类的友元,可以赋予该函数与类成员函数一样的访问权限,也就是说我们可以在友元函数当中访问类的私有成员变量。在介绍友元函数的使用之前,我们需要先了解为什么需要友元函数。C++Primer中给了一个非常不错的例子,在之前运算符重载的例子当中,我们实现了一个类Time。用来记录时间,假设我们需要重载它的*运算符,能够允许一个时间对象和一个浮点数相乘。很明显,我们只需要重载运算符*即可:TimeTime::operator*(constdoublex){ //todo } 复制我们在使用的时候大概是这样:Timea,b; a=b*32.5; 复制但是这里有一个小问题,我们写成a=b*32.5;可以,但如果反过来写成32.5*b就不行了。因为对于b*32.5来说本质
*CTF2022writeup这是在协会参加的第一场XCTF分站赛,虽然协会的师傅们把webak了但是我是没有能够帮上什么忙,赛后也是补一下题目然后复盘一下。6星的师傅们也都在github仓库开源了他们的题目,也是非常感谢师傅们愿意开源题目以便于复现赛题。oh-my-grafana官方给的docker好像有点问题,还没能够在本地搭建起复现环境,有点晚了明天继续看看oh-my-noteprooh-my-lotto&revengeTODAY这是一道社工题目,也算是第一次遇到吧,长个见识。“I’manninefour.Ilovemachinelearninganddatascience. Flagisinmypocket!” 根据Ilovemachinelearninganddatascience.,kaggle的介绍Kaggle:YourMachineLearningandDataScienceCommunity,在kaggle上搜索anninefour可以搜到用户发现简介部分@1liujing在推特上搜索1liujing找到对应用户去googlemap搜一下,从图中x夫果品生鲜超
昨天和前天,我们分析了几款基于Broadcom芯片的数据中心交换机的实现。为什么Broadcom的交换芯片会有StrataXGS和StrataDNX两条泾渭分明的路线呢?这就要从Broadcom交换芯片的各个分支门派说起了。前边提到,Broadcom拥有Higig技术,可以让多颗交换ASIC通过Higig互联,虚拟化为一个大的交换网络。拥有Higig技术的属于Broadcom的两大产品线:StrataXGS和StrataConnect。StrataConnect属于Broadcom的园区网络产品,提供千兆、2.5G、5G及中低密度的万兆交换芯片,一般内置CAM和TCAM,MAC表项不超过64K,路由表项不超过32K,主打低成本园区网络场景。StrataXGS属于Broadcom的主流产品,以数据中心为主。这个系列在2015年以前内部流派众多,有Helix,Firebolt,Triumph,Enduro,Apollo等不同代号的产品。演变到了今天,只剩下两个主支“三叉戟”(Trident)和“回旋镖”(Tomahawk)两个系列,以及旁支Maverick系列。Trident系列主打可编程
分享一个由原生JS实现的注册或登录时,输入邮箱时下拉提示效果,效果如下:实现代码如下:<!DOCTYPEhtml> <html> <head> <metahttp-equiv="Content-Type"content="text/html;charset=utf-8"/> <title>原生JS实现登录框提示</title> <style> *{ margin:0; padding:0; } body{ font:12px/1.125Arial,Helvetica,sans-serif; } li{ list-style:none; } #login{ width:252px; height:385px; /*彩色背景图*/ background:url(images/0.jpg)no-repeat; margin:20pxauto; position:relative; } .detail{ margin:005px30px; position:re
“Request-Reply”特性1使用场景随着服务规模的扩大,单机服务无法满足性能和容量的要求,此时需要将服务拆分为更小粒度的服务或者部署多个服务实例构成集群来提供服务。在分布式场景下,RPC是最常用的联机调用的方式。在构建分布式应用时,有些领域,例如金融服务领域,常常使用消息队列来构建服务总线,实现联机调用的目的。消息队列的主要场景是解耦、削峰填谷,在联机调用的场景下,需要将服务的调用抽象成基于消息的交互,并增强同步调用的这种交互逻辑。为了更好地支持消息队列在联机调用场景下的应用,rocketmq-4.7.0推出了“Request-Reply”特性来支持RPC调用。2设计思路在rocketmq中,整个同步调用主要包括两个过程:(1)请求方生成消息,发送给响应方,并等待响应方回包;(2)响应方收到请求消息后,消费这条消息,并发出一条响应消息给请求方。整个过程实质上是两个消息收发过程的组合。所以这里最关键的问题是如何将异步的消息收发过程构建成一个同步的过程。其中主要有两个问题需要解决:2.1请求方如何同步等待回包这个问题的解决方案中,一个关键的数据结构是RequestResponseF
前言在《全程软件测试》一书中,朱少民老师在软件测试能力模型中,所提到的分析性思维与麦肯锡所提出的闭环思维思想非常类似,是软件测试工程师必不可少的一项软性素质,因此本文将结合测试工作介绍闭环思维的内容及应用。两种思维的介绍分析性思维分析性思维是一种循序渐进的思维方法,从收集问题的相关信息、比较不同来源信息、明确真正的问题到得出适当的问题解决方案,一步一步去解决问题的方法: 注:以上内容引用自微信文章<<看家本领之二:软件测试的分析性思维>> 闭环思维 “闭环”的理论根据是“PDCA循环”,由美国质量管理专家休哈特博士提出,被广泛用于现代企业管理中。 “PDCA循环”将管理分为四个阶段: 计划(Plan)执行(Do)检查(Check)行动(Act)这四个过程不是运行一次就结束,而是周而复始地进行。 注:以上内容引用自知乎文章<<什么是“闭环思维”?>> 对比两种思维,我们发现这两者均是一种分析、行动、评估、总结改进的循环递进式思想,因此本文我们以PDCA循环结合实际实例,说明其在日常测试工作中的应用。闭环思维的应用举例 日常工
近日,一份由360手机助手评选发布的“2016年度嗨APP榜”系列榜单引发用户和业内人士的广泛热议。此榜单是根据2016年APP的覆盖量、好评度、增长度,并最终由用户投票评选得出。最终的结果综合了多维度数据,真实反映出了用户对于各种APP的喜好,从中也可以看出用户对于移动生活需求的潮流和转变,可以说是一部活的移动生活变迁史。图:360手机助手正式发布“2016年度嗨APP全民榜”360手机助手此次发布的“2016年度嗨APP榜”最终从参与评选的上千款应用中产生了两大类榜单:一类是覆盖用户主要移动生活的21个主流APP分类“嗨APP全民榜”,每个榜单评选出该分类的TOP5APP;另一类,是以用户年龄、性别、身份进行区分的“2016年度嗨APP新锐榜”。这两个榜单几乎涵盖了2016年用户移动生活的各种场景和各个人群。有业内人士表示,通观整个榜单,在榜单覆盖的21大类别APP中几乎囊括了各大头部应用,而新锐榜则体现出诸多新兴APP的崛起。这不仅反映出移动互联网应用行业在2016年的变化,更是反映出用户移动互联网生活的变迁,通过这一榜单,即可对网民手机应用偏好以及移动生活的变迁“窥一斑而知全豹
现今有许多IT领域的巨头对人工智能产生了兴趣。人工智能已经成为我们日常生活的一部分,并能够进一步深入,从而满足我们的日常需求。现有工具明确表明,人工智能在商业和营销领域能够发挥重大作用。以下介绍部分基于人工智能的出色工具,这些工具可让中小企业受益。1.GluruGluru可以充当个人助理,它会留意您的日历、跟踪会议和活动,并就您的截止期限、待办事项和约会提供每日摘要。它会自动提供您在这些活动中所需的全部电子邮件、文件和其他信息。2.X.aiX.ai是用于安排会议的个人助理。只需在回复邮件时抄送给Amy这个虚拟个人助理,它就会为您完成后续工作。它能够按类型或机动时间安排会议。用户只需表明自己是有空还是忙碌,Amy就会进行相应安排。3.CrystalCrystal是一个平台,可供您查看用户的性格分析并就如何与他们交流为您提供建议。它可帮助您构建更健康且更高效的关系。它以古老的移情原则为依据,告诉您如何与拥有LinkedIn档案的任何人交谈、进行邮件往来以及向他们售卖物品。4.IntraspexionIntraspexion是一个深度学习平台,可充当早期预警系统,防止可能出现诉讼的情况。5.
一直以来非常庆幸曾经有翻过《代码大全2》;这使我崎岖编程之路少了很多不必要的坎坷。它在软件工艺的话题中有写到一篇:“首先是为人写程序,其次才是机器(WriteProgramsforPeopleFirst,ComputersSecond)”。虽然这是针对代码可读性来谈及的,但这间接昭示了开发效率之重要不是?此次以Vue,Es6,Jade,Scss,Webpack,Gulp等一套强大组合来改善团队前端工作流,首因即出于这个理念。 微注:如此处排版不尽如您意,可移步VueES6JadeScssWebpackGulp查看。 不觉间,突入这深似海的前端,已近一年。虽然时间不长,却也经历了几个框架的更替。然而这并未使我感觉到Coding的快乐:因为本质上,整日都在做着重复的事儿用重复的方法,这就好如让你整日拿着烂扫帚,在一座乏味的猥楼前,人为而机械地,日复一日地扫楼前枯枝落叶一般。如此,倒也没什么忒糟糕;只是有一点:即便扫得三年,这经验和功力也就几天(即学会这套机制所用时间)而已。直到遇到这VueWebpack。 为何有上述的一点小感慨嘞?这缘于现在的工作内容。如今我们团队人倒满多,再招几个
一、缘起 一切脱离业务的架构设计与新技术引入都是耍流氓。 引入一个技术之前,首先应该解答的问题是,这个技术解决什么问题。 就像微服务分层架构之前,应该首先回答,为什么要引入微服务,微服务究竟解决什么问题(详见《互联网架构为什么要做微服务?》)。 最近分享了几篇MQ相关的文章: 《MQ如何实现延时消息》 《MQ如何实现消息必达》 《MQ如何实现幂等性》 不少网友询问,究竟什么时候使用MQ,MQ究竟适合什么场景,故有了此文。 二、MQ是干嘛的 消息总线(MessageQueue),后文称MQ,是一种跨进程的通信机制,用于上下游传递消息。 在互联网架构中,MQ是一种非常常见的上下游“逻辑解耦+物理解耦”的消息通信服务。 使用了MQ之后,消息发送上游只需要依赖MQ,逻辑上和物理上都不用依赖其他服务。 三、什么时候不使用消息总线 既然MQ是互联网分层架构中的解耦利器,那所有通讯都使用MQ岂不是很好?这是一个严重的误区,调用与被调用的关系,是无法被MQ取代的。 &n
三步完成配置一台电脑下多git账号配置 1、生成密钥 git客户端安排好后,打开gitBash,生成SSHkey。 ssh-keygen-trsa-C"user1111@email.com" //生成密钥1复制 把密钥安排进代码托管工具,不赘叙了。需要去另一篇博客查看。 ssh-keygen-trsa-f~/.ssh/id_rsa2-C"user22222@email.com" //生成密钥2复制 注意不能再使用默认的文件名id_rsa,否则会覆盖之前密钥文件。 再密钥安排进另一个代码托管工具。 2、配置config文件 在.ssh目录下创建一个config文本文件,主要配置项说明 Host别名 HostName主机名 Port端口 User用户名 IdentityFile密钥文件的路径 IdentitiesOnly只接受SSHKey登录 PreferredAuthenticationspublickey强制使用PublicKey验证复制 具体配置,增加托管平台诸如此类... #配置github Hostgith
P4550收集邮票 题目描述 有n种不同的邮票,皮皮想收集所有种类的邮票。唯一的收集方法是到同学凡凡那里购买,每次只能买一张,并且买到的邮票究竟是n种邮票中的哪一种是等概率的,概率均为1/n。但是由于凡凡也很喜欢邮票,所以皮皮购买第k张邮票需要支付k元钱。现在皮皮手中没有邮票,皮皮想知道自己得到所有种类的邮票需要花费的钱数目的期望。 输入格式 一行,一个数字NN<=10000 输出格式 要付出多少钱.保留二位小数 输入输出样例 输入#1复制 3复制 输出#1复制 21.25复制 这一道题可咋做? 顿时懵了 我们先来想一下这个问题的简化版由简入繁 假如一共只有1种邮票(废话啊)那买到的概率自然是1/1肯定能够买到 (QAQ不就是1嘛) 假如一共只有2种邮票(事情越来越有意思了) 如果不考虑两种邮票之间的联系买到第一种邮票的概率是1/2第二种也是1/2 1+{1*1/2+2*1/4+3*(1/2)^3+...+k*(1/2)^k} k是正
1//通过递归实现正逆序打印字符串的例子来分析递归三种执行顺序与递归思想的关系,正线,逆线,反值线 2 3 4//用迭代思想实现的递归,是属于递归正线 5voidprintStr1(char*str)//正序打印字符串 6{ 7if(*str) 8{ 9printf("%c",*str); 10printStr1(str+1); 11} 12} 13 14//用递归思想实现的递归,是属于递归逆线 15voidprintStr2(char*str)//逆序打印字符串 16{ 17if(*str) 18{ 19printStr2(str+1); 20printf("%c",*str); 21} 22} 23 24 25//逆线包括反值线,反值线是返回值给上一项。 26 27 28 29 30#include<stdio.h> 31 32intmain(void) 33{ 34char*str="12345678"; 35printStr2(str);putchar(10); 36printStr1(str);putchar(10); 37 38re
一、JPA通用策略生成器 通过annotation来映射hibernate实体的,基于annotation的hibernate主键标识为@Id, 其生成规则由@GeneratedValue设定的.这里的@id和@GeneratedValue都是JPA的标准用法, JPA提供四种标准用法,由@GeneratedValue的源代码可以明显看出. 1@Target({METHOD,FIELD}) 2@Retention(RUNTIME) 3public@interfaceGeneratedValue{ 4GenerationTypestrategy()defaultAUTO; 5Stringgenerator()default""; 6}复制 其中GenerationType: 1publicenumGenerationType{ 2TABLE, 3SEQUENCE, 4IDENTITY, 5AUTO 6}复制 JPA提供的四种标准用法为TABLE,SEQUENCE,IDENTITY,AUTO. TABLE:
Java内存区域 基本问题 JVM=类加载器(classloader)+执行引擎(executionengine)+运行时数据区域(runtiomedataarea) Java内存区域——运行时数据区域 JDK1.6 JDK1.8 线程私有的: 程序计数器虚拟机栈本地方法栈 线程共享的: 堆方法区直接内存(非运行时数据区的一部分) (一)程序计数器 方便面试总结话术: 程序技术器就是当前线程所执行的字节码的行号指示器。多线程是通过轮转切换并分处理器执行时间的方式来实现的,为了线程能切换恢复到正确执行的位置,每条线程都有程序计数器来记录上次执行的位置。并且各个线程的程序计数器是互不影响的,即线程私有的内存。 程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。字节码解释器工作时通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等功能都需要依赖这个计数器来完成。 另外,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各线程之间计数器互不影响,独立存储,我们称这类内存区域为“线程私有
SAPSD基础知识之销售模式 转载自:https://www.cnblogs.com/DicksonJYL/p/12381956.html 销售模式有很多种方式,譬如产品销售的渠道(直销、经销、零售等等),SAP系统通过分销渠道(DistributeChannel)来区分产品销售渠道。 SAP几种销售模式: 按库存销售 按销售订单生产 跨公司销售 成套销售 寄售销售 项目销售 第三方销售和单独采购 按库存销售(MTS) 创建销售订单—>创建发货单并发货过账—>创建发票 按销售订单生产(MTO) 创建销售订单—>根据销售订单生成生产订单—>生产订单收货,入库后形成销售订单库存—>创建发货单,从销售订单库存出货—>创建发票 跨公司销售(crosscompanysales) 跨公司销售是指销售单据中的发货工厂对应的公司和销售组织对应的公司为不同的公司。 场景:公司A为生产性质的公司,负责生产各类产品,公司B为销售性的公司,一般不持库存,公司B接到客户的订单后,直接从A公司发货给客户。 如果不通过跨公司销售,则需要B公司先向A
1、?的使用 第一种:可空类型修饰符(?),即定义数据类型可为空 目的是用于对int,double,bool等无法直接赋值为null的类型进行null的赋值 inti;//-->defaultvalueis0 int?valueOfNull;//-->defaultvalueisnull复制 说明 引用类型可以使用空引用,表示一个不存在的值,而值类型通常不能表示为空。 例如: stringstr=null; 是正确的, inti=null; 编译器就会报错。 为了使值类型也可为空,就可以使用可空类型,即用可空类型修饰符"?"来表示,表现形式为"T?" 例如: int? 表示可空的整型, DateTime? 表示可为空的时间。 T? 其实是System.Nullable(泛型结构)的缩写形式,也就意味着当你用到T?时,编译器编译时会把T?编译成System.Nullable的形式。 例如:int? 编译后便是System.Nullable的形式。 &nb
JWT权限认证是目前系统开发常用的组件,接下来我们就给webAPI项目集成一下JWT,至于JWT实现的原理百度一大堆,自己可以找有针对性的文章,看一下就行了。 创建一个简单的POCO类,用来存储签发或者验证jwt时用到的信息: publicclassTokenManagement { ///<summary> /// ///</summary> [JsonProperty("secret")] publicstringSecret{get;set;} ///<summary> /// ///</summary> [JsonProperty("issuer")] publicstringIssuer{get;set;} ///<summary> /// ///</summary> [JsonProperty("audience")] publicstringAudience{get;set;} ///<summary> ///
题目链接:https://cn.vjudge.net/problem/UVA-11806 题意 在一个mn的矩形网格里放k个石子,问有多少方法。 每个格子只能放一个石头,每个石头都要放,且第一行、最后一行、第一列和最后一列都有石子。 思路 设A为第一行格子、B为最后一行、C为第一列、D为最后一列。 很明显发现ABCD这个集合包含了重复元素,那么按照容斥定理可解。 注意: 1000007不是素数,不能递推算逆元,因为mod%i==0 不要用乘法递推式算C,要用加法 容斥的技巧,用cont计数总方案,_cont计数奇偶 提交过程 WA×n 上面的注意注意一下 AC 代码 #include<cstdio> #include<cstring> constintmaxn=20+5,maxk=500+20;; constlonglongmod=1000007;//isnotaprime. intn,m,k; longlongC[maxk][maxk]; voidinit(void){ memset(C,0,sizeof(C)); C[0][