一.手动实现注册功能

        注册功能1.渲染前端标签获取用户输入      >>>       渲染标签2.获取用户输入传递到后端校验    >>>       校验数据3.校验未通过展示错误信息        >>>       展示信息校验数据(前后端都可以校验)校验前端后端都可以做,但是前端可以不做,后端必须得做!!!

后端:

def reg(request):errors={'username':'','password':''}if request.method == 'POST':username=request.POST.get('username')password=request.POST.get('password')if 'sb' in username:errors['username']='user is not valid'if password == '123':errors['password']='too easy'return render(request,'reg.html',locals())

前端:

<body>
<h1>注册页面</h1>
<form action="" method="post"><p>username:<input type="text" name="username"><span>{{ errors.username }}</span></p><p>password:<input type="password" name="password"><span>{{ errors.password }}</span></p><input type="submit"></form>
</body>

效果:

二. django form组件

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

    1.校验数据:

         测试小技巧:      

           

  

            第一步需要一个form类from django import formsclass MyForm(forms.Form):name = forms.CharField(max_length=6)password = forms.CharField(max_length=8,min_length=3)email = forms.EmailField(required=True)第二步实例化form对象from app01 import viewsform_obj=views.MyForm({'name':'jasonhaha','password':'12','email':'123'})第三步查看数据校验是否合法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),不想传可以改成False
                   校验数据的时候可以都传(多传的数据不会做任何的校验>>>不会影响form校验规则)

     2.渲染标签:

            后端:

from django import formsclass MyForm(forms.Form):name = forms.CharField(max_length=6,label='用户名')     #不写label,则在前端显示的是Namepassword = forms.CharField(max_length=8,min_length=3)email=forms.EmailField(required=False)def reg(request):form_obj = MyForm()render(request,'reg.html',locals())

        前端:

            form组件只帮你渲染获取用户输入的标签,不会帮你渲染提交按钮,需要手动添加<h1>第一种渲染方式(可扩展性较差)</h1>{{ form_obj.as_p }}{{ form_obj.as_ul }}
            <input type="submit">
<h1>第二种渲染方式</h1><form action=""><p>{{ form_obj.name.label }}{{ form_obj.name }}</p>                   #label可标识前面的注释      <p>{{ form_obj.password.label }}{{ form_obj.password }}</p><p>{{ form_obj.email.label }}{{ form_obj.email }}</p><input type="submit"></form>            <h1>第三种渲染标签的方式</h1><form action="">{% for foo in form_obj %}<p>{{ foo.label }}{{ foo }}</p>{% endfor %}
              <input type="submit">
            </form>

     前端取消校验:

<form action="" method="post" novalidate>
</form>

  3.form组件前后端综合使用

         后端:

from django import formsclass MyForm(forms.Form):name = forms.CharField(max_length=6)password = forms.CharField(max_length=8,min_length=3)email=forms.EmailField(required=True)def reg(request):form_obj = MyForm()if request.method == 'POST':print(request.POST)form_obj = MyForm(request.POST)if form_obj.is_valid():return HttpResponse('ok')return render(request,'reg.html',locals())

     前端:

<h1>第三种渲染标签的方式</h1>
<form action="" method="post" novalidate>{% for foo in form_obj %}   #foo是每一个输入框对象<p>{{ foo.label }}{{ foo }}<span>{{ foo.errors.0 }}</span></p>{% endfor %}
<input type="submit">

          form组件提交数据如果数据不合法,页面上会保留之前用户输入的信息
 

效果:

  

 错误提示可以自定义成中文:

class MyForm(forms.Form):name = forms.CharField(max_length=6,label='用户名',error_messages={'max_length':'用户名最长6位','required':'用户名不能为空'})password = forms.CharField(max_length=8,min_length=3,error_messages={'max_length': '密码最长8位','required': '密码不能为空','min_length':'密码最少3位'}email = forms.EmailField(error_messages={'invalid':'邮箱格式不正确','required':'邮箱不能为空'})

效果:

  4.把注册信息写入数据库:

models.py:

from django.db import models# Create your models here.
class User(models.Model):name = models.CharField(max_length=32)password = models.CharField(max_length=32)email = models.EmailField()

后端:

def reg(request):form_obj = MyForm()if request.method == 'POST':print(request.POST)form_obj = MyForm(request.POST)if form_obj.is_valid():data=form_obj.cleaned_datamodels.User.objects.create(**data)return render(request,'reg.html',locals())

ps:

在使用form组件对模型表进行数据校验的时候,只需要保证字段一致
那么在创建的对象的时候,把校验通过后的字典键值对拿过来,就直接**form_obj.cleaned_data

效果:

三. 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

四. forms.widgets的相关用法(可设置标签样式)

class MyForm(forms.Form):name = forms.CharField(max_length=6,label='用户名',error_messages={'max_length':'用户名最长6位','required':'用户名不能为空'})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'}))confirm_password = forms.CharField(max_length=8, min_length=3, error_messages={'max_length': '确认密码最长8位','required': '确认密码不能为空','min_length': '确认密码最少3位'},widget=widgets.PasswordInput())email = forms.EmailField(error_messages={'invalid':'邮箱格式不正确','required':'邮箱不能为空'})gender = forms.ChoiceField(choices=((1, "男"), (2, "女"), (3, "保密")),label="性别",initial=3,  # 默认值widget=forms.widgets.RadioSelect())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())

效果:

五.django操作cookie,session

        http协议四大特性1.基于TCP/IP作用于应用层的协议2.基于请求响应3.无状态4.无连接cookie保存在客户端浏览器上的键值对session保存在服务端上的键值对服务端产生随机的串儿返回给客户端,服务端找一个地方将串儿与对应的信息存起来{'随机字符串':'敏感信息'}

  1.cookie:

        djangoreturn HttpResponse()return render()return redirect()obj = HttpResponse()return objobj = render()return objobj = redirect()return obj设置cookieobj.set_cookie()  # 给浏览器设置cookie
            获取cookierequest.COOKIE.get('name')request.COOKIE['name']

cookie版登录认证:

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)# obj.set_cookie('name','jason',max_age=5)                                        注释:cookie生命周期为5sobj.set_cookie('name','jason')return objreturn 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@login_auth
def index(request):print(request.COOKIES.get('name'))# if request.COOKIES.get('name'):return HttpResponse('我是index页面,只有登录了才能看')@login_auth
def home(request):return HttpResponse('我是home页面,只有登录了才能看')@login_auth
def xxx(request):return HttpResponse('我是xxx页面,只有登录了才能看')def logout(request):rep = redirect("/login/")rep.delete_cookie("user")  # 删除用户浏览器上之前设置的usercookie值return rep

2.session:

            设置sessionrequest.session['name'] = 'jason'# 1.先生成一个随机的字符串# 2.在django session表中存储该随机字符串与数据的记录# 3.将随机的字符串发送给客户端浏览器
                获取sessionrequest.session.get('name')# 1.django自动获取浏览器随机字符串取django session表里面比对# 2.如果比对成功 会将当前随机字符串对应的数据赋值给request.session# 3.通过request.session操作该数据(数据不存在也不会影响我们的业务逻辑)

django默认的session存活时间是两周(14天),每个浏览器只有一条数据:

def set_session(request):request.session['name'] = 'jason'request.session['name1'] = 'egon'request.session['name2'] = 'tank'request.session['name3'] = 'nick'request.session['name4'] = 'sean'return HttpResponse('ok')def get_session(request):print(request.session.get('name'))print(request.session.get('name1'))print(request.session.get('name2'))print(request.session.get('name3'))print(request.session.get('name4'))return HttpResponse('ok')def delete_session(request):request.session.delete()return HttpResponse('ok')def flush_session(request):request.session.flush()return HttpResponse('ok')

        浏览器会设置一个键为sessionid来存放session值# 删除当前会话的所有Session数据
        request.session.delete()# 删除当前的会话数据并删除会话的Cookie。
        request.session.flush() 这用于确保前面的会话数据不可以再次被用户的浏览器访问例如,django.contrib.auth.logout() 函数中就会调用它。

        浏览器会设置一个键为sessionid来存放session值# 删除当前会话的所有Session数据
        request.session.delete()# 删除当前的会话数据并删除会话的Cookie。
        request.session.flush() 这用于确保前面的会话数据不可以再次被用户的浏览器访问例如,django.contrib.auth.logout() 函数中就会调用它。

session版登录认证:

from functools import wrapsdef check_login(func):@wraps(func)def inner(request, *args, **kwargs):next_url = request.get_full_path()if request.session.get("user"):return func(request, *args, **kwargs)else:return redirect("/login/?next={}".format(next_url))return innerdef login(request):if request.method == "POST":user = request.POST.get("user")pwd = request.POST.get("pwd")if user == "alex" and pwd == "alex1234":# 设置sessionrequest.session["user"] = user# 获取跳到登陆页面之前的URLnext_url = request.GET.get("next")# 如果有,就跳转回登陆之前的URLif next_url:return redirect(next_url)# 否则默认跳转到index页面else:return redirect("/index/")return render(request, "login.html")@check_login
def logout(request):# 删除所有当前请求相关的session
    request.session.delete()return redirect("/login/")@check_login
def index(request):current_user = request.session.get("user", None)return render(request, "index.html", {"user": current_user})

转载于:https://www.cnblogs.com/sima-3/p/11051834.html

Django之form组件!相关推荐

  1. 转载:Django之Form组件

    Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试牛刀 1.创建Form类 + View C ...

  2. Django之Form组件介绍

    --------------------------------------前言------------------------------------ 在进入正题之前,想多说两句; 当我们开始学习一 ...

  3. Django的form组件提交时错误不显示或无法提交

    出现的问题:在学习django的form组件时,对不符合form组件定义的字段无法提交,进而导致无法显示出自定义的错误信息.(因为无法提交就代表着数据没有传给后台,然后你的错误回显是在后台对数据的检验 ...

  4. Django之Form组件

    一.Form组件介绍 1.Form组件可以做的几件事情 1.用户请求数据验证 2.自动生成错误信息 3.打包用户提交的正确信息 4.如果其中有一个错误了,其他的正确这,保留上次输入的内容 5.自动创建 ...

  5. Django框架-Form组件

    一.DjangoForm组件介绍 我们之前在html页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校 ...

  6. Django中Form组件的使用

    Form介绍 HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否输入,输入 ...

  7. Django之form组件加cookie,session

    ---恢复内容开始--- 多对表的三种创建 一全自动(推荐使用) 优点:不需要手动创建第三张表也就是我们之前一直用的,靠那个不会在数据库中显示的虚拟字段,告诉orm帮我们创建能够表示多对多关系的第三张 ...

  8. django.forms生成HTML,第21天,Django之Form组件

    ModelForm 一.Form组件初识 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 mo ...

  9. 小白IT:Django框架—form组件和ModelForm

    文章目录 一.form简介 1.form组件的功能 2.form组件的简单使用 数据库模型准备 form简单使用 在视图函数中写注册函数 模板文件login.html文件 二.Form中常用字段约束与 ...

最新文章

  1. kubernetes集群网络配置方案——flannel部署
  2. c#语言中代替指针,如何在C#中使指针通用?
  3. 运行 OpenCV-Python-Toturial-中文版 遇到的一些错误问题
  4. main函数解析(一)——Linux-0.11 学习笔记(五)
  5. 一步一步教你使用AgileEAS.NET基础类库进行应用开发-基础篇-通过SQL实现特殊业务...
  6. 谈谈地址转换协议ARP的概念及特点
  7. 【clickhouse】clickhouse 主从配置 从节点无数据
  8. python从入门到精通需要多久-学Python编程难吗 从入门到精通学习Python要多久
  9. opendrive中的几何形状
  10. python实现鼠标键盘事件_鼠标与键盘操作事件
  11. latex 定理环境,引理,定义,自定义 proof 环境
  12. 凌晨3点--- 给我一支烟
  13. java-清楚明了的集合
  14. quartus13波形仿真
  15. sql 创建表,批量插入数据
  16. import和@import
  17. 华为技术有限公司总裁任正非
  18. 勇往直前的菜鸟修炼手册
  19. C语言以延时的状态读取数据文件,CH376 U盘文件读写相关C语言代码
  20. 视频轻量级下载工具 you-get/ lulu/ Annie 合集

热门文章

  1. 配置SQL Server的命名管道和TCP/IP设置
  2. 计算机网络实验题教程推介,计算机网络实验教程从原理到实践(附光盘)
  3. 收发一体超声波测距离传感器模块_超声波避障传感器在哪些地方运用
  4. c++ 多个字符串排序_RPython Data Science系列:数据处理(5)--字符串函数基于R(一)
  5. java中未解决的编译问题_java – 我遇到了这个异常:未解决的编译问题
  6. mysql登录跳转不了_Session过期后实现自动跳转登录页面
  7. 2020年书法落款_书法落款的基本常识
  8. r语言list添加元素_Redis数据结构 List 类型】List 类型生产中的应用 消息队列、排行榜、朋友圈、监控程序的实现...
  9. python中的tuple_Python中的tuple元组详细介绍
  10. 使用计算机系统管理商品存货,ERP管理系统中编码的意义