8.写一个表单验证

在数据库创建的时候,我们要创建一些用户,为了统一管理,我们将创建一个用户类继承自Django自带的用户类,并对其进行权限的分类,

1530991530327.png
1530991566071.png

可以看出AbstractUser就是Django自带的用户类。

1530991620542.png

并且他自带了很多需要自带的字段,我们继承之后只要外加自己想要加入的字段就可以

登录

首先,我们做一个登录的表单,我们拿之前自己创建的管理员用户去登录。

1.流程

1530991791188.png

点击登录

1530991805119.png

输入账号密码

点击登录

登录成功之后跳转到首页面

1531059779150.png
/views.py
class Login_View(View):
    def get(self,request):
        #因为是登录模块的表单验证,所以如果是get请求,则账号密码可能会暴露在url地址栏中,所以我们是
        #拒绝这样的请求的,如果他是get请求,则直接返回空页面给用户
        return render(request,'login.html')
    def post(self,request):
        # 如果是post请求,则1.我们要拿到账号和密码 2.检查账号密码是否符合要求。3.符合要求之后是否存在于数据库中
        # 4.如果存在,则跳转至登录界面,并且显示登录成功。如果失败,则清空输入框跳转至登录
        form = loginForm(request.POST)#加载表单也就是post上来的表单数据
        if form.is_valid(): #valid有效的,这里判断form表单是否有效
            username = request.POST['username']
            password = request.POST['password']
            user = authenticate(username=username,password=password)
            if user is not None:
                if user.is_active:
                    login(request,user)
                else:
                    return render(request,'login.html',{'message':'账号未激活'})
            else:
                return render(request,'login.html',{'message':'不好意思,不存在这个账号'})
        else:
            return render(request,'login.html',{'form_message':form})
/urls.py
path('login/',Login_View.as_view(),name = 'login'),

form表单

我们会单独写一个form.py文件来专门写form。这个form里面写了对提交数据的一些约束

1531004133609.png

这些约束其实大部分就是字段的内容。

另外对于我们传向模板的参数中,有一个form

这个form自带了一些判断。

比如我们可以用来

<div class="form-group marb20 {% if form_message.username.errors %} errorput{% endif %}">
    <label>用&nbsp;户&nbsp;名</label>
    <input name="username" id="account_l" type="text" placeholder="手机号/邮箱" />
</div>

form_message.username.errors

如果post传递的username为空,则会出现errorput的错误样式

1531002971158.png
<div class="error btns login-form-tips" id="jsLoginTips">
{% for key, error in form_message.errors.items %}
    {{ error }}
{% endfor %}
    {{ message }}
</div>

同样可以通过这个方法来取值。显示错误信息

1531002981757.png

使用邮箱登录

1.测试数据

1531003521859.png

2.流程

使用django的指定认证后端Django AUTHENTICATION_BACKENDS

使用Q操作查询数据库中的内容

查找username=username 或者email=username

如果存在则返回user

什么是认证后端

Django维护一个”authentication backends”的列表用来测试认证。当调用 django.contrib.auth.authenticate() — Django将尝试所有的认证后端。如果第一个认证方法失败了,Django将会继续尝试第二个,直到所有的都被尝试过。 认证后端的列表在 AUTHENTICATION_BACKENDS 设置。内容应该是包含Python路径的元组。默认情况下, AUTHENTICATION_BACKENDS 设置为 (‘django.contrib.auth.backends.ModelBackend’,),这是检测Django用户数据库的基本认证方案。 按照 AUTHENTICATION_BACKENDS 的排列顺序,如果同样的用户名和密码在第一次就匹配了,那么Django将停止处理后面的东西。

1.在setting.py中设置内容

AUTHENTICATION_BACKENDS=(
    'users.views.CustomBackend',
)

2.在view.py里面编写内容

1531059767832.png
from django.db.models import Q
1531003811850.png

这里重写了authenticate这个函数。方法就是因为我们需要根据邮箱来登录验证。所以当我们输入任何内容取认证的时候,他都会来到这个方法中取验证。首先验证username,发现错误之后,因为是Q函数,所以他会取调用email=username。如果通过则会使用user.check_password(password)验证莫玛。成功则返回user

这样一个登录的表单验证就做好了,接下来是登出

1531004540151.png
1531004551287.png

注册

1.流程

1531057567569.png

点击注册,跳转到注册界面

1531057600925.png

这是一个post请求,同时还附带了一个get请求。

验证码

其中验证码的图片是一个get请求。我们要使用到另外一个插件库

django-simple-captcha

1531058101261.png
1531058131148.png
1531058185155.png
1531058382011.png
1531058392611.png
1531059032098.png
1531059046584.png

账户验证激活

当注册成功后,会自动登录。但是账号未被激活,这个时候我们需要发送邮箱来激活这个账号

1.首先我们需要在setting.py中设置

1531059255568.png

email_host_user 为你的QQ邮箱账号

email_host_password为你的授权的密码

email_from 为你的QQ邮箱账号

1531059407330.png
1531059423135.png

写一个专门生成随机字符串的方法来提供调用

紧接着写一个用来判断注册链接和忘记密码链接的方法

这些内容写在一个utile文件夹下,专门用来存放脚本的文件夹

另外,我们还需要在写一个方法用来激活这些内容

使用的是get请求

1531059608246.png

这是激活

1531059643782.png

这是忘记密码和更新密码

1531059664670.png
1531059676118.png

1531059684295.png

modelform

一般的form表单是这样的,引用的是django.form.Form

1531064511412.png

但是一旦需要验证的字段过多就会出现不断重写Field

做普通的form表单
可以对form表单进行一定的限制,比如required=TRUE 表示该内容必须不为空,否则会报错(相当于blank=true,null=true),
min_length = 2表示最小长度为2,max_length =20表示最大长度为20
缺点:代码的重复性过高

这个时候出现出现了modelform

1531065060218.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,509评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,806评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,875评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,441评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,488评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,365评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,190评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,062评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,500评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,706评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,834评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,559评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,167评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,779评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,912评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,958评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,779评论 2 354

推荐阅读更多精彩内容