djangoIII

今日内容 :

今日习得了:1多对多三种创建方式

​ 2.forms校验性组件

​ 3.django settings源码

多对多创建有三种方法

​ 第一种是全自动的,第二种是全手写的,第三种是半自动的

全自动就是

让django自动创建第三张表

这样的话,第三张表的拓展性会很差,但是真的很方便

全手写就是去掉manytomany那一条,然后靠自己的力量写出来

不过如果是自己写的就不支持orm的跨表查询了,但是里面的东西都可以自己定义

以上两种好像都不是很好,因此我们换别的方法,半自动,获取他们各自的长处,舍弃他们的短处

很简单,在manytomany后面加一些参数即可定义新的列表名

books = models.ManyToManyField(to='Book', through='Book2Author', through_fields=("authors","book"))

但是它任然不支持

add remove clear set

forms组件可以手动书写html代码获取用户输入

然后将数据传递给后端做数据校验

如果数据出错了会展示错误信息

然后如果我们要使用forms组件的话必须要提前写一个类

不过不要忘记导入模块

			class MyForm(forms.Form):
				# username字段 最少三位 最多八位
				username = forms.CharField(max_length=8,min_length=3)
				# password字段 最少三位  最多八位
				password = forms.CharField(max_length=8,min_length=3)
				# email字段 必须是邮箱格式
				email = forms.EmailField()

校验数据页很简单哦

我们只要给写好的类传字典数据就行

这里我们来举个例子,首先我们定义一个表格

form_obj=views.MyForm({'username':'jason','password':'12','email':'123'}})

然后通过is_valid()来判断输入的数据是否合法
如果有不合法通过errors来查看为什么不合法
cleaned_data可以看合法的数据
如果有个地方没有输入的话.报错的内容会变成this field is required
如果写多了,那是没问题的,只会校验它需要的参数

渲染标签
forms组件只会渲染输入的标签,如果要提交按钮或者选择按钮得我们自己手动添加

{{ form_obj.as_p }}这个会渲染所有input框
{{ form_obj.as_ul }}
{{ form_obj.as_table }}可是这些方法的封装程度太高了,很难修改

还有一种方法
{{ form_obj.username.label }}{{ form_obj.username }}
{{ form_obj.username.label }}{{ form_obj.password }}
{{ form_obj.username.label }}{{ form_obj.email }}
懒人克星,真的太长了,于是我就放弃使用这种了

因此我们使用第三只方法
{% for form in form_obj %}

{{form.lable}}{{form}}


{% endfor %}

前端的数据校验是那么的弱不禁风,稍微动一下手脚就能攻破,因此我们一般都是后端来进行数据校验
校验数据我们会在后端使用列表和validator

from django.core.validators import RegexValidator
validators=[

RegexValidator(r'^[0-9]+$', '请输入数字'), RegexValidator(r'^159[0-9]+$', '数字必须以159开头'),

]

钩子函数HOOK

当你觉得上面所有的校验还不能满足的时候就该轮到钩子来治你了

在这个函数里面你可以写任意的校验代码

如果你想校验单个字段就使用局部钩子

想要校验多个字段就要使用全局钩子

光是这些还没完

要想添加其他的功能,你可以用

label initial required widget等

label对应input提示信息

initial 对应input框默认值

required 对应默认为true 可以控制是否必填

widge 可以给input框设定样式