首页 > 其他分享 >Django——基于forms组件和ajax的注册功能

Django——基于forms组件和ajax的注册功能

时间:2023-05-05 17:36:55浏览次数:45  
标签:code form random request Django forms ajax valid user

Django——基于forms组件和ajax的注册功能

path('register/',views.register)
#注册的form表单
from django import forms
from django.forms import widgets
 
class RegForm(forms.Form):
    user = forms.CharField(max_length=32,widget=widgets.TextInput(attrs={'class':'form-control'}),label='用户名')
    pwd = forms.CharField(max_length=32,widget=widgets.PasswordInput(attrs={'class':'form-control'}),label='密码')
    re_pwd = forms.CharField(max_length=32,widget=widgets.PasswordInput(attrs={'class':'form-control'}),label='确认密码')
    email = forms.EmailField(max_length=32,widget=widgets.EmailInput(attrs={'class':'form-control'}),label='邮箱')
 
 
#注册
def register(request):
    if request.is_ajax():  #这一步也可以用if request.method==POST判断
        form = RegForm(request.POST)
        response = {'user': None,'msg': None}  #返回的数据,默认设置为 None
 
        if form.is_valid():
            #如果前端检验成功,返回校验后的正确信息
            #这一步还需要把用户注册信息保存到数据库中
            response['user'] = form.cleaned_data.get('user')
        else:
            #如果前端检验失败,返回错误信息
            response["msg"] = form.errors
 
        return JsonResponse(response)
 
    form = RegForm()
    return render(request,'register.html',{'form': form})
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>注册</title>
    <link rel="stylesheet" href="{% static 'blog_app/bootstrap/css/bootstrap.css' %}">
    <script src="{% static 'blog_app/jq.js' %}"></script>
</head>
<body>
    <div class="container">
        <div class="row">
            <div class="col-md-6 col-md-offset-3">
                <h3>注册</h3>
                <hr>
                <form>
                    {% csrf_token %}
                     
                    {% for field in form %}    {# 循环form表单对象,field表示每一个字段 #}
                        <div class="form-group">
                            <label for="{{ field.auto_id }}">{{ field.label }}</label>  {# field.auto_id表示生成表单时的id值 #}
                            {{field}}
                        </div>
                    {% endfor %}
 
                    <div class="form-group">
                        <label for="avatar">
                            头像
                            <img src="/static/blog_app/default.png" width="70px" height="70px" id="avatar_img">
                        </label>
                        <input type="file"  id="avatar" style="display: none">
                    </div>
                     
                    <input type="button" class="btn btn-success register_btn" value="注册" id="register_btn"><span class="error"></span>
                </form>
            </div>
        </div>
    </div>
 
    <script>
        // 头像预览
        $('#avatar').change(function(){
            // 获取用户选中的文件对象
            var file_obj = $(this)[0].files[0]
            // 获取文件对象的路径(使用文件阅读器)
            var reader = new FileReader()       // 创建一个文件阅读器对象
            reader.readAsDataURL(file_obj)      // 读出文件的路径
             // 显示预览头像图片
            reader.onload = function(){
                $('#avatar_img').attr('src',reader.result)
            }
        })
 
        // Ajax提交注册信息,数据以FormData的形式发送,组键值对
        $('#register_btn').click(function (){
            var formdata = new FormData()
            formdata.append("user",$('#id_user').val())
            formdata.append("pwd",$('#id_pwd').val())
            formdata.append("re_pwd",$('#id_re_pwd').val())
            formdata.append("email",$('#id_email').val())
            formdata.append("avatar",$('#avatar')[0].files[0])
            formdata.append("csrfmiddlewaretoken",$('[name="csrfmiddlewaretoken"]').val())
 
            $.ajax({
                url: '',
                type: 'post',
                contentType: false,   //使用formdata提交时,必须配置的
                processData: false,   //使用formdata提交时,必须配置的
                data: formdata,
                success: function (data) {
                    // 回调函数
                    // 接收后端返回的信息,并进行打印
                    // 还可以通过返回的数据进行相应的前端错误提示,以及进行相应的路径跳转
                    console.log(data)
                }
            })
        })
    </script>
 
</body>
</html>

Django——基于Ajax的登录功能实现

urlpatterns = [
    path('admin/', admin.site.urls),
    path('login/',views.login),
    path('get_validCode_img/',views.get_validCode_img),
    path('index/',views.index),
]
from django.http import JsonResponse
from django.shortcuts import render,HttpResponse
from PIL import Image      #图像处理模块,pip install pillow
from PIL import ImageDraw  #在图片上画画,处理验证码文字
from PIL import ImageFont  #字体
import random
from io import BytesIO   #内存管理的工具
from django.contrib import auth
 
 
#登录
def login(request):
    if request.method == 'POST':    #Ajax以POST方式提交登录信息
        response = {'user': None,'msg': None}    #定义Ajax请求的返回值
        user = request.POST.get('user')
        pwd = request.POST.get('pwd')
        valid_code = request.POST.get('valid_code')
        valid_code_str = request.session.get('valid_code_str')    #获取session保存的验证码的值
 
        if valid_code.upper() == valid_code_str.upper():          #和用户输入的验证码进行比对验证,不区分大小写
            user = auth.authenticate(username=user,password=pwd)  #登录信息验证
            if user:
                auth.login(request,user)  #登录状态保持
                response['user'] = user.username
            else:
                response['msg'] = 'username or password error'
 
        else:
            response['msg'] = 'valid code error'
 
        return JsonResponse(response)   #返回验证的最终结果JSON数据
 
    return render(request,'login.html')
 
 
 
#登录的验证码
def get_validCode_img(request):
 
    def get_random_color():    #定义一个随机生成图片的颜色的函数,用于生成图片的颜色
        return (random.randint(0,255),random.randint(0,255),random.randint(0,255))
 
    img = Image.new("RGB",(270,40),color=get_random_color())   #创建一个图片对象img
 
    draw = ImageDraw.Draw(img)       #创建一个画笔对象,在img上画画
    font = ImageFont.truetype("static/blog_app/font/AaMingYueJiuLinTian.ttf",size=30)   #创建字体,字体文件需要下载,第一个参数为字体文件的路径
 
    valid_code_str = ""  #用于保存验证码
    for i in range(5):
        random_num = str(random.randint(0,9))   #随机数字
        random_low_alpha = chr(random.randint(95,122))   #随机小写字母
        random_upper_alpha = chr(random.randint(65,90))  #随机大写字母
        random_char = random.choice([random_num,random_low_alpha,random_upper_alpha])   #三选一赋值给random_char
        draw.text((i*20+80,5),random_char,get_random_color(),font=font)   #在img上写字
 
        valid_code_str += random_char    #保存验证码
 
    # with open('validCode.png','wb') as f:         #创建一个文件句柄
    #     img.save('f','png')                       #将图片写到文件中去,但是是写到磁盘中,格式为:‘png’
    # with open('validCode.png','rb') as f:
    #     data = f.read()                           #将图片从磁盘读出来
 
    request.session["valid_code_str"] = valid_code_str   # ***将当前的验证码的值 保存到用户的session中,在用户登录的时候,和用户输入的验证码做比对验证
 
    #上面的文件操作是在磁盘的操作,不太好,下面是在内存中操作
    f = BytesIO()        #创建一个内存句柄
    img.save(f,'png')    #将图片存到内存中
    data = f.getvalue()  #再从内存中获取图片给data
 
    return HttpResponse(data)    #返回图片
 
 
def index(request):
    return HttpResponse('登录成功')
{% load static %}
 
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>login</title>
    <link rel="stylesheet" href="{% static 'blog_app/bootstrap/css/bootstrap.css' %}">
    <script src="{% static 'blog_app/jq.js' %}"></script>
</head>
<body>
    <h3>登录</h3>
    <div class="container">
        <div class="row">
            <div class="col-md-6 col-md-offset-3">
                <form>
                    {% csrf_token %}
                    <div class="form-group">
                        <label for="user">用户名</label>
                        <input type="text" id="user" class="form-control">
                    </div>
                    <div class="form-group">
                        <label for="pwd">密码</label>
                        <input type="password" id="pwd" class="form-control">
                    </div>
 
                    <div class="form-group">
                        <label for="">验证码</label>
                        <div class="row">
                            <div class="col-md-6">
                                <input type="text" class="valid_code form-control" id="valid_code">
                            </div>
                        <div class="col-md-6">
                            <img src="/get_validCode_img/" alt="验证码图片" width="270" height="40" id="valid_code_img">
                        </div>
                    </div>
                    </div>
 
                    <input type="button" class="btn btn-info login_btn" value="登录" id="login_btn"><span class="error"></span>
                    <a href="/register/" class="btn btn-success">注册</a>
                </form>
            </div>
        </div>
    </div>
 
    <script>
        // 点击时刷新登录的验证码
        $('#valid_code_img').click(function(){
                $(this)[0].src +="?"
        })
 
        // 登录验证码验证
        $('#login_btn').click(function(){
            $.ajax({
                url: '',
                type: 'post',
                data: {
                    user: $('#user').val(),
                    pwd: $('#pwd').val(),
                    valid_code: $('#valid_code').val(),
                    csrfmiddlewaretoken: $('[name="csrfmiddlewaretoken"]').val(),   // 需要自己组csrf_token键值
                },
                success: function (res) {           // res接受登录验证后返回的数据
                    console.log(res)
 
                    if(res.user){      // 如果存在user,即验证通过
                        location.href="/index/"    //这一步表示:如果验证成功,则跳转到'/index/'路径
                    }
                    else {              // 如果验证失败,则把错误信息显示到页面的span标签中,提示用户
                        $('.error').text(res.msg).css({color: 'red'})
                    }
                }
            })
        })
    </script>
</body>
</html>
  

标签:code,form,random,request,Django,forms,ajax,valid,user
From: https://www.cnblogs.com/mengdie1978/p/17374779.html

相关文章

  • Django之Model操作
    Django之Model操作一、字段AutoField(Field)-int自增列,必须填入参数primary_key=TrueBigAutoField(AutoField)-bigint自增列,必须填入参数primary_key=True注:当model中如果没有自增列,则自动会创建一个列名为id的列fromdjango.db......
  • Django评论树的实现
    Django评论树的实现实现django评论树使用了三种方式第一种方式通过递归实现缺点:每次查找parent_id的时候都要在ret所有的元素里面找一遍,找不到再在元素的children中寻找,一直找到为止comment_list=[{'id':1,'content':'Python最牛逼','user':'小李','parent_i......
  • Django--数据及字段的增删改查
    字段的增删改查#增pwd=models.IntegerField(verbose_name="密码",null=True)#verbose_name说明;null可以为空is_delete=models.CharField(default=0)#设置为默认值#改直接改代码然后执行数据库迁移命令即可#删注释掉代码然后执行数据库迁移命令即可数据的......
  • 【2】Django项目-人力资源管理系统-设计表结构
    Django项目-人力资源管理系统-设计表结构一、在models.py中编写表结构创建两张表:部门表和用户信息表fromdjango.dbimportmodels#Createyourmodelshere.classDepartment(models.Model):'''部门表'''dp_name=models.CharField(max_length=32,verbo......
  • django3.0异步、提高项目并发量
    1补充django3.0#补充:django3.0以后支持异步-ASGI:WSGI是基于HTTP协议模式的,不支持WebSocket(需要其他模块处理,eg:channels)ASGI的诞生则是为了解决Python常用的WSGI,不支持当前Web开发中的一些新的协议标准,例如:websocket,http2的协议,且还支持异步-django......
  • Django项目-人力资源管理系统
    人力资源管理系统【HRMS】一、pycharm新建项目1.新建项目2.创建APP-website2.1  方法1:终端输入pythonmanage.pystartappwebsite2.2 方法2:利用Pycharm工具输入:快捷键 CTRL+ALT+R输入startappwebsite 2.3 创建完成 ......
  • djangoadmin后台搜索结果筛选自定义模版
    django-admin对搜索结果进行自定义统计,可参考代码如下:defchangelist_view(self,request,extra_context=None):#cur1_time=datetime.now()data_dict={}value=request.GET.get('q',"")bill_cycle=request.GET.get('bi......
  • Django笔记三十五之admin后台界面介绍
    本文首发于公众号:Hunter后端原文链接:Django笔记三十五之admin后台界面介绍这一篇介绍一下Django的后台界面使用。Django自带了一套后台管理界面,可用于我们直接操作数据库数据,本篇笔记目录如下:创建后台账号以及登录操作注册后台显示的数据表列表字段的显示操作字段值......
  • Django之ajax
    Django之ajax前后端传输数据的编码格式(理论篇)""" 只研究post请求的编码格式,get不研究 url?username=xxx&password=yyy,这就是get提交的"""form表单能够2种: 1.urlencoded2.form-data#json格式的数据form表单无法提交能够提交json的格式有: 1.ajax2.第三方工......
  • Django内置序列化组件(drf前身)和批量操作数据加上分页器
    目录一、django内置序列化组件(drf前身)这里的内置序列化组件,其实就是实现将后端数据,存放到字典中或是存放到列表中有序输出。方式一这里是我们用JsonResponse模块自己实现的代码'''前后端分离的项目视图函数只需要返回json格式的数据即可'''fromapp01importmodelsfr......