自我总结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'})