其他分享
首页 > 其他分享> > Day59

Day59

作者:互联网

今日总结

forms组件钩子函数

# 钩子函数的含义其实就是在程序的执行过程中穿插额外的逻辑

# 局部钩子:校验用户名是否已存在(一次性只能勾一个人)
	def clean_name(self):  # 自动生成的函数名 专门用于对name字段添加额外的校验规则
        # 1.先获取用户名
        name = self.cleaned_data.get('name')
        # 2.判断用户名是否已存在
        is_exist = models.User.objects.filter(name=name)
        if is_exist:
            # 3.提示信息
            self.add_error('name', '用户名已存在')
        # 4.最后将你勾上来的name返回回去
        return name
    
# 全局钩子:校验密码与确认密码是否一致(一次性可以勾多个人)
	def clean(self):
        # 1.获取多个字段数据
        password = self.cleaned_data.get('password')
        confirm_password = self.cleaned_data.get('confirm_password')
        if not password == confirm_password:
            self.add_error('confirm_password', '两次密码不一致 你个傻帽!!!')
        # 最后将整个数据返回
        return self.cleaned_data

forms组件字段参数

min_length			最小长度
max_length			最大长度
label			字段名称
error_messages			错误提示
min_value			最小值
max_value			最大值
initial			默认值
validators			正则校验器

forms组件字段类型

initial 	# 初始值,input框里面的初始值
class LoginForm(forms.Form):
    username = forms.CharField(
        min_length=8,
        label="用户名",
        initial="张三"  # 设置默认值
    )
    pwd = forms.CharField(min_length=6, label="密码")
    
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="密码")
    
password
class LoginForm(forms.Form):
    ...
    pwd = forms.CharField(
        min_length=6,
        label="密码",
        widget=forms.widgets.PasswordInput(attrs={'class': 'c1'}, render_value=True)
    )
    
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()
    )
# 单选Select		
class LoginForm(forms.Form):
    ...
    hobby = forms.ChoiceField(
        choices=((1, "篮球"), (2, "足球"), (3, "双色球"), ),
        label="爱好",
        initial=3,
        widget=forms.widgets.Select()
    )
    
# 多选Select
class LoginForm(forms.Form):
    ...
    hobby = forms.MultipleChoiceField(
        choices=((1, "篮球"), (2, "足球"), (3, "双色球"), ),
        label="爱好",
        initial=[1, 3],
        widget=forms.widgets.SelectMultiple()
    )
    
# 单选checkbox	
class LoginForm(forms.Form):
    ...
    keep = forms.ChoiceField(
        label="是否记住密码",
        initial="checked",
        widget=forms.widgets.CheckboxInput()
    )
    
# 多选checkbox	
class LoginForm(forms.Form):
    ...
    hobby = forms.MultipleChoiceField(
        choices=((1, "篮球"), (2, "足球"), (3, "双色球"),),
        label="爱好",
        initial=[1, 3],
        widget=forms.widgets.CheckboxSelectMultiple()
    )

ModelForm简介

forms组件主要配合models里面的默写类一起使用 但是默写类里面的字段需要在forms类中相当于重写一遍 代码冗余 为了更好的结合forms与models的关系 就有了ModelForm(基于forms组件)

class MyUser(forms.ModelForm):
    class Meta:
        model = models.User  # 指定关联的表
        fields = '__all__'  # 所有的字段全部生成对应的forms字段
        labels = {
            'name': '用户名',
            'age': '年龄',
            'addr': '地址',
            'email': '邮箱'
        }
        widgets = {
            "name": forms.widgets.TextInput(attrs={"class": "form-control"}),
        }
        
def reg(request):
    form_obj = MyUser()
    if request.method == 'POST':
        form_obj = MyUser(request.POST)
        if form_obj.is_valid():
            # form_obj.save()  # 新增数据
            edit_obj = models.User.objects.filter(pk=5).first()
            form_obj = MyUser(request.POST, instance=edit_obj)  # 是新增还是保存就取决于有没有instance参数
            form_obj.save()  # 编辑数据
    return render(request, 'reg.html', locals())

cookie与session简介

# cookie
	早期的互联网应用程序都是不保存用户状态的 所有人发送请求返回的都是相同的页面
    	现在几乎所有的应用程序都可以保存用户状态
    当你成功登录之后浏览器会在本地帮你保存用户名和密码
  		每次操作浏览器自动发送用户名和密码
        
        # cookie指代存储在客户端上与用户信息相关的数据
        
# session简介
	用户登录成功之后 服务端生成一个随机字符串 返回给客户端保存
  		之后客户端每次发请求携带该随机字符串 服务端获取之后比对后台数据
        
        # session指代服务端保存的跟用户信息相关的数据
        
"""
1.session的工作必须依赖于cookie
2.客户端也有权拒绝保存数据
"""

django操作cookie

# 设置cookie
	res.set_cookie()  
    # 参数
    key		键
    value=''	值
    max_age=None	超时44过期时间
    expires=None	过期时间,需要传具体日期,同时设置max_age,expires那么将会使用expires的值作为过期时间
    path='/', Cookie生效的路径,/ 表示根路径,根路径的cookie可以被任何url的页面访问
    domain=None, Cookie生效的域名
    secure=True, 该Cookie是否仅被使用安全协议传输。安全协议。安全协议有HTTPS,SSL等,在网络上传输数据之前先将数据加密。默认为false。当使用https式,必须要secure设置为Y=True
    httponly=False 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)
# 获取cookie
  	res.COOKIE.get()  # 获取
    # 参数
    default		默认值
    salt	加密盐
    max_age		过期时间

标签:name,label,forms,Day59,length,cookie,class
来源: https://www.cnblogs.com/ymxda9/p/16303947.html