Form组件 cookie和session

django form组件
1.渲染标签
2.校验数据
3.展示信息

第一步需要一个form类

from django import forms

class MyForm(forms.Form):
        name = forms.CharField(max_length=6)
        password = forms.CharField(max_length=8,min_length=3)
        email = forms.EmailField(required=True)

第二部实例化form对象

form_obj = MyForm({'name':'jason'})

第三步查看数据校验是否合法

form_obj.is_valid()  # 只有当所有的字段都校验通过才会返回True

​ 第四步查看校验错误的信息


form_obj.errors  # 这个里面放的是所有校验未通过的字段及错误提示
"""
{
'name': ['Ensure this value has at most 6 characters (it has 7).'], 
'password': ['Ensure this value has at least 3 characters (it has 2).'], 
'email': ['Enter a valid email address.']
}
"""
第五步查看校验通过的数据
form_obj.cleaned_data  # 符合校验规则数据都会被放到该对象中
ps:form组件校验数据的规则从上往下依次取值校验
校验通过的放到cleaned_data
校验失败的放到errors
注意:
form中所有的字段默认都是必须传值的(required=True)
校验数据的时候可以都传(多传的数据不会做任何的校验>>>不会影响form校验规则)

form组件渲染标签

def   reg(request):
	form_obj = MyForm()
	return render(request,'reg.html',locals())

第一种 一行代码渲染所有的数据(扩展性差)

{{ form_obj.as_p }} 
{{ form_obj.as_ul }}

第二种

<form action="">
        <p>{{ form_obj.name.label }}{{ form_obj.name }}</p>
        <p>{{ form_obj.password.label }}{{ form_obj.password }}</p>
        <p>{{ form_obj.email.label }}{{ form_obj.email }}</p>
        <input type="submit">
</form>

渲染指定后端字段

后端可以通过在定义字段的时候加上默认属性
from django import forms

class MyForm(forms.Form):
        name = forms.CharField(max_length=6,lable = '用户名')
        password = forms.CharField(max_length=8,min_length=3,lable='密码')
        email = forms.EmailField(required=True)

第三种(p标签)

<form action="">
    {% for foo in form_obj %}
            <p>{{ foo.label }}{{ foo }}</p>
    {% endfor %}
</form>
	前端取消校验
		<form action="" method="post" novalidate>
		</form>

综合使用

  • 错误提示消息为中文
  • 用户输入错误之后保留原来的数据

局部钩子和全局钩子

		# 局部钩子函数  (单个字段的校验利用局部钩子函数)
		def clean_name(self):
			name = self.cleaned_data.get('name')
			if '666' in name:
				self.add_error('name','光喊666是不行的,要有真实力!')
			return name  # return还是要加上的,兼容性考虑


		# 全局钩子函数  (多个字段的校验利用全局钩子函数)
		def clean(self):
			password = self.cleaned_data.get('password')
			confirm_password = self.cleaned_data.get('confirm_password')
			if not password == confirm_password:
				self.add_error('confirm_password',"两次密码不一致,你这个dsb!")
			return self.cleaned_data

创建Form类时,主要涉及到 【字段】 和 【插件】,字段用于对用户请求数据的验证,插件用于自动生成HTML;

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()
    )

choice字段注意事项

在使用选择标签时,需要注意choices的选项可以配置从数据库中获取,但是由于是静态字段 获取的值无法实时更新,需要重写构造方法从而实现choice实时更新。

方式一:

from django.forms import Form
from django.forms import widgets
from django.forms import fields

 
class MyForm(Form):
 
    user = fields.ChoiceField(
        # choices=((1, '上海'), (2, '北京'),),
        initial=2,
        widget=widgets.Select
    )
 
    def __init__(self, *args, **kwargs):
        super(MyForm,self).__init__(*args, **kwargs)
        # self.fields['user'].choices = ((1, '上海'), (2, '北京'),)
        # 或
        self.fields['user'].choices = models.Classes.objects.all().values_list('id','caption')

方式二:

from django import forms
from django.forms import fields
from django.forms import models as form_model

 
class FInfo(forms.Form):
    authors = form_model.ModelMultipleChoiceField(queryset=models.NNewType.objects.all())  # 多选
    # authors = form_model.ModelChoiceField(queryset=models.NNewType.objects.all())  # 单选

添加样式

		from django import forms
		from django.forms import widgets
		password = forms.CharField(max_length=8,min_length=3,error_messages={
							'max_length': '密码最长8位',
							'required': '密码不能为空',
							'min_length':'密码最少3位'
							},widget=widgets.PasswordInput(attrs={'class':'c1 form-control'}))
		
		
				hobby = forms.ChoiceField(
				choices=((1, "篮球"), (2, "足球"), (3, "双色球"),),
				label="爱好",
				initial=3,
				widget=forms.widgets.Select()
			)
			hobby1 = forms.MultipleChoiceField(
				choices=((1, "篮球"), (2, "足球"), (3, "双色球"),),
				label="爱好",
				initial=[1, 3],
				widget=forms.widgets.SelectMultiple()
			)

			keep = forms.ChoiceField(
				label="是否记住密码",
				initial="checked",
				widget=forms.widgets.CheckboxInput()
			)
	
		
			obj = HttpResponse()
			return obj
			obj = render()
			return obj
			obj = redirect()
			return obj
		
			
			设置cookie
				obj.set_cookie()  # 给浏览器设置cookie
			
			获取cookie
				request.COOKIE.get('name')
				request.COOKIE['name']
		
		def login(request):
			if request.method == 'POST':
				username = request.POST.get('username')
				password = request.POST.get('password')
				if username == 'jason' and password == '123':
					old_path = request.GET.get('next')
					if old_path:
						obj = redirect(old_path)
					else:
						obj = redirect('/home/')
					# 用户登录成功 朝浏览器设置一个cookie
					obj.set_cookie('name','jason',expires=7*24*3600)
					return obj
			return render(request,'login.html')

用户登录装饰器

		from functools import wraps
		def login_auth(func):
			@wraps(func)
			def inner(request,*args,**kwargs):
				# 校验cookie
				# print(request.get_full_path())
				old_path = request.get_full_path()
				if request.COOKIES.get('name'):
					return func(request,*args,**kwargs)
				return redirect('/login/?next=%s'%old_path)
			return inner
		
		
		def logout(request):
			rep = redirect("/login/")
			rep.delete_cookie("user")  # 删除用户浏览器上之前设置的usercookie值
			return rep

​ django默认的session存活时间是两周(14天)

posted @ 2019-06-17 22:25  如海  阅读(291)  评论(0编辑  收藏  举报