自我总结50

多对多三种创建方式

全自动

好处:至始至终你都没有操作第三张表 全部都是由orm自动帮你创建的

内置了四个操作第三张表的方法

add

remove

set

clear

不足:自动创建的第三张表无法扩展修改字段 表的扩展性较差

纯手撸

好处: 第三张表中字段个数和字段名称全都可以自己定义

不足:不再支持orm跨表查询 不再有正反向的概念(跨表)

跨表操作方法

add remove set clear

半自动(推荐使用)

好处: 可以任意的添加和修改第三张表中的字段,并且支持orm跨表查询

不足:不支持四个方法

"""
当你的ManyToManyField只有一个参数to的情况下 orm会自动帮你创建第三张表

如果你加了through和through_fields那么orm就不会自动帮你创建第三张表 但是它会在内部帮你维护关系 让你能够继续使用orm的跨表查询

through  自己指定第三张关系表
through_fields  自己指定第三张关系表中 到底哪两个字段维护者表与表之间的多对多关系
"""

forms组件

手动书写html代码获取用户输入 >>>>> 渲染标签

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

如果数据有误,展示错误信息 >>>>> 展示信息

forms组件准备

from django import forms # 使用form组件之前,提前写一个form类

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组件默认渲染获取用户输入的标签,渲染提交按钮需要手动添加

标签方式1 封装太高 不推荐使用 只适合本地测试

{{form_obj.as_p}}  # 自动渲染所有input框 
{{form_obj.as_ul}}
{{form_obj.as_table}}

标签方式2 不推荐使用 写的麻烦

{{ form_obj.username.label }}{{ form_obj.username }}
{{ form_obj.username.label }}{{ form_obj.password }}
{{ form_obj.username.label }}{{ form_obj.email }}

标签方式3 推荐使用!!

{%for form in form_obj%}
	<p>{{ form.label }}{{ form }}</p> # form 等价于标签2中的对象点字段名
{% endfor %}	

展示信息

<form action="" method="post" novalidate>
	{% for forms in form_obj %}
	<p>
		{{ forms.label }}{{ forms }}
		<span>{{ forms.errors.0 }}</span>
	</p>  <!--form 等价于你方式2中的对象点字段名-->
	{% endfor %}
	<input type="submit">
</form>

校验数据

给写好的类 传字典数据

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

查看校验的数据是否合法

is_valid

form_obj.is_valid()
# 只有当你的数据全部符合校验规则的情况下 结果才是True 否则都为False

查看不符合规则的字段及错误的理由

.errors

# 例子
form_obj.errors
{
'password': ['Ensure this value has at least 3 characters (it has 2).'],
'email': ['Enter a valid email address.']
}

查看符合校验规则的数据

cleaned_data

form_obj.cleaned_data
	{'username': 'jason'}

**forms组件只会校验forms类中定义的字段,定义的字段默认都是必须传值的 ,不能少传;如果你多传了 不会有任何影响 **

form_obj = views.MyForm({'username':'jason','password':'12345'})
form_obj.is_valid()
# False
form_obj.errors
# {'email': ['This field is required.']}


form_obj = views.MyForm({'username':'jason','password':'12345','email':'123@qq.com','xxx':'嘿嘿嘿'})
form_obj.is_valid()
# True

通常校验数据前后端都有,但主要依靠后端校验(必须全面),前端可有可无,因此告诉浏览器不做校验 form表单中加一个novalidate参数即可

内置校验器

from django.core.validators import RegexValidator
validators=[
			RegexValidator(r'^[0-9]+$', '请输入数字'),
			RegexValidator(r'^159[0-9]+$', '数字必须以159开头'),
		]

钩子函数 Hook

在你需要的时候抓东西

所有的校验还不能够满足需求 ,考虑使用钩子函数

局部钩子 校验单个字段

全局钩子 校验多个字段

补充

其他参数

initial input框默认值

required 默认为True控制字段是否必填

label input对应的提示信息

widget 给input框设置样式及属性

widget=forms.widgets.PasswordInput()

widget=forms.widgets.TextInput({'class':'form-control c1 c2','username':'jason'})

posted @ 2019-12-03 20:27  jzm1201  阅读(112)  评论(0编辑  收藏  举报