Django商城项目注册功能的实现

设计到的前端知识

项目的前端页面使用vue来实现局部刷新,通过数据的双向绑定实现与用户的交互,下面来看一下需求,在用户输入内容后,前端需要做一些简单的规则校验,我们希望在在用户输入后能够实时检测,如果有错误能够在输入框的下方显示出来。

<li>
    <label>用户名:</label>
    <input type="text" name="username" id="user_name">
    <span class="error_tip">请输入5-20个字符的用户</span>
</li>
<li>
    <label>密码:</label>
    <input type="password" name="password" id="pwd">
    <span class="error_tip">请输入8-20位的密码</span>
</li>

上面是一个用户和密码的输入框,当用户输入完用户名以后,光标离开输入框,能够实时的检测输入内容的正确性,当输入有问题的时候,在输入框的下方显示错误信息。

v-model实现数据的双向绑定,v-on进行事件绑定,v-show是控制dom显示与否,下面是加入vue后的部分代码

<li>
    <label>用户名:</label>
    <input type="text" name="username" id="user_name" v-model="username" @blur="check_username">
    <span class="error_tip" v-show="error_name">[[error_name_message]]</span>
</li>
<li>
    <label>密码:</label>
    <input type="password" name="password" id="pwd" v-model="password" @blur="check_password">
    <span class="error_tip" v-show="error_password">请输入8-20位的密码</span>
</li>

用户输入的用户名和username变量绑定,光标消失触发绑定时间check_username,通过v-show绑定到布尔值变量error_name,来控制是否显示字符串变量error_name_message,其他的输入框都类似这种操作。

注册业务实现

前端注册业务逻辑

注册表单代码:

<form method="post" class="register_form" >
    {{ csrf_input }}
    <ul>
        <li>
            <label>用户名:</label>
            <input type="text" name="username" id="user_name" v-model="username" @blur="check_username">
            <span class="error_tip" v-show="error_name">[[error_name_message]]</span>
        </li>
        <li>
            <label>密码:</label>
            <input type="password" name="password" id="pwd" v-model="password" @blur="check_password">
            <span class="error_tip" v-show="error_password">请输入8-20位的密码</span>
        </li>
        <li>
            <label>确认密码:</label>
            <input type="password" v-model="password2" @blur="check_password2" name="password2"
                   id="cpwd">
            <span class="error_tip" v-show="error_password2">两次输入的密码不一致</span>
        </li>
        <li>
            <label>手机号:</label>
            <input type="text" v-model="mobile" @blur="check_mobile" name="mobile" id="phone">
            <span class="error_tip" v-show="error_mobile">[[ error_mobile_message ]]</span>
        </li>

        <li>
            <label>图形验证码:</label>
            <input type="text" name="image_code" id="pic_code" class="msg_input">
            <img src="{{ static('images/pic_code.jpg') }}" alt="图形验证码" class="pic_code">
            <span class="error_tip">请填写图形验证码</span>
        </li>
        <li>
            <label>短信验证码:</label>
            <input type="text" name="sms_code" id="msg_code" class="msg_input">
            <a href="javascript:;" rel="external nofollow"  class="get_msg_code">获取短信验证码</a>
            <span class="error_tip">请填写短信验证码</span>
        </li>
        <li class="agreement">
            <input type="checkbox" name="allow" id="allow" v-model="allow" @change="check_allow">
            <label>同意”商城用户使用协议“</label>
            <span class="error_tip" v-show="error_allow">请勾选用户协议</span>
        </li>
        <li class="reg_sub">
            <input type="submit" value="注 册" @change="on_submit">
            {% if register_errmsg %}
                <span class="error_tip2">{{ register_errmsg }}</span>
            {% endif %}
        </li>
    </ul>
</form>

导入vue.js和ajax请求的js库

<script type="text/javascript" src="{{ static('js/vue-2.5.16.js') }}"></script>
<script type="text/javascript" src="{{ static('js/axios-0.18.0.min.js') }}"></script>

准备register.js文件

register.js文件主要处理注册页面的交互事件,并且向服务端提交注册表单请求

<script type="text/javascript" src="{{ static('js/register.js') }}"></script>

下面是实现的前端校验逻辑以及表单提交逻辑

methods: {
    // 校验用户名
    check_username() {
        let re = /^[a-zA-Z0-9_-]{5,20}$/;
        if (re.test(this.username)) {
            this.error_name = false;
        } else {
            this.error_name_message = '请输入5-20个字符的用户名';
            this.error_name = true;
        }
    },
    // 校验密码
    check_password() {
        let re = /^[0-9A-Za-z]{8,20}$/;
        this.error_password = !re.test(this.password);
    },
    // 校验确认密码
    check_password2() {
        if (this.password !== this.password2) {
            this.error_password2 = true;
        } else {
            this.error_password2 = false;
        }
    },
    // 校验手机号
    check_mobile() {
        let re = /^1[3-9]\d{9}$/;
        if (re.test(this.mobile)) {
            this.error_mobile = false;
        } else {
            this.error_mobile_message = '您输入的手机号格式不正确';
            this.error_mobile = true;
        }
    },
    // 校验是否勾选协议
    check_allow() {
        this.error_allow = !this.allow;
    },
    // 监听表单提交事件
    on_submit() {
        this.check_username();
        this.check_password();
        this.check_password2();
        this.check_mobile();
        this.check_allow();
				# 输入字段中有一个不符合规则就禁止
        if (this.error_name === true || this.error_password === true || this.error_password2 === true
            || this.error_mobile === true || this.error_allow === true) {
            // 禁用表单的提交
            window.event.returnValue = false;
        }
    },
}

后端业务注册逻辑

在用户输完用户名之后,我们往往希望能够跟快的给出这个用户名是否符合注册需求,前面只是对用户名的规则进行了校验,还想知道他是否已经在系统注册过了,不然当用户都输完提交注册再给出用户名或者手机号已经注册过,体验不是特别好。所以需要在光标离开用户名输入框的时候就请求服务端来判断是否注册过。

定义路由

path('register/', views.RegisterView.as_view(), name='register'),  # name添加命名空间
path('usernames/<str:username>', views.UsernameCountView.as_view(), name="username"),
re_path(r'mobiles/(?P<mobile>1[3-9]\d{9})', views.MobileCountView.as_view(), name='mobile')

编写视图类

class UsernameCountView(View):

    def get(self, request, username):
        """
        查询该用户名是否在系统中存在
        :param request: 请求对像
        :param username: 前端传递的用户名
        :return:
        """
        count = User.objects.filter(username=username).count()
        return http.JsonResponse({'code':1001, 'msg':'用户已存在'}) if count == 1 \
            else http.JsonResponse({'code': 1000, 'msg': ''})

这里没有对响应做统一处理封装,后面专门介绍一下。

然后就是注册视图类的编写了:

class RegisterView(View):
    """用户注册视图类"""

    def get(self, request):
        '''获取注册页面'''
        return render(request, 'register.html')

    def post(self, request):
        """"""
        username = request.POST.get('username')
        password = request.POST.get('password')
        password2 = request.POST.get('password2')
        mobile = request.POST.get('mobile')
        allow = request.POST.get('allow')
        # 判断参数是否齐全
        if not all([username, password, password2, mobile, allow]):
            return http.HttpResponseForbidden('缺少必传参数')
        # 判断用户名是否是5-20个字符
        if not re.match(r'^[a-zA-Z0-9_-]{5,20}$', username):
            return http.HttpResponseForbidden('请输入5-20个字符的用户名')
        # 判断密码是否是8-20个数字
        if not re.match(r'^[0-9A-Za-z]{8,20}$', password):
            return http.HttpResponseForbidden('请输入8-20位的密码')
        # 判断两次密码是否一致
        if password != password2:
            return http.HttpResponseForbidden('两次输入的密码不一致')
        # 判断手机号是否合法
        if not re.match(r'^1[3-9]\d{9}$', mobile):
            return http.HttpResponseForbidden('请输入正确的手机号码')
        # 判断是否勾选用户协议
        if allow != 'on':
            return http.HttpResponseForbidden('请勾选用户协议')

        try:
            user = User.objects.create_user(username=username, password=password, mobile=mobile)
        except DatabaseError as e:
            return render(request, 'register.html', {'register_errmsg': e.args})

        # 注册成功保存会话
        login(request, user)

        return redirect(reverse('contents:index'))

django提供的login方法,封装了写入session的操作,帮助我们快速登入一个用户,并实现状态保持,将通过认证的用户的唯一标识信息(比如:用户ID)写入到当前浏览器的 cookie 和服务端的 session 中。

request.session[SESSION_KEY] = user._meta.pk.value_to_string(user)
request.session[BACKEND_SESSION_KEY] = backend
request.session[HASH_SESSION_KEY] = session_auth_hash

session会存入redis,之前在工程创建时进行session存储的配置

SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "session"

链接: https://pan.baidu.com/s/1dFliI6KkNubd4k_OTEpqDA 提取码: h3dp

以上就是Django商城项目注册功能的实现的详细内容,更多关于Django 注册功能的资料请关注我们其它相关文章!

(0)

相关推荐

  • django注册用邮箱发送验证码的实现

    视图代码 lis = []#设置一个空列表用来存放发送的验证码,用来验证 def yzm1(): res1 = "" for i in range(4):#用四个随机数组成验证码 num = random.randint(0, 9) res1 += str(num) lis.append(res1)#将验证码放入空的列表中 return res1#返回验证码 class zc(View): def get(self, request): return render(request, '

  • django实现用户注册实例讲解

    创建一个apps包 专门来放子应用 创建users子应用 处理用户事务 追加导包路径 在settings中用 print(sys.path) 查看现有导包路径 sys.path.insert(0,'/home/python/oldproject/meiduo/meiduo/apps') 但是这样过于low 换成下面这样 sys.path.insert(0,os.path.join(BASE_DIR,'apps')) 这样就可以简化导包方式 自定义用户模型类 django自带的用户模型类User

  • Django实现auth模块下的登录注册与注销功能

    看了好多登录注册和注销的教程,很乱,很迷,然后总结了一下,简单的做了一个登录,注册和注销的页面. 1,首先,使用pycharm创建一个项目 单击File -> 选中Django -> 在右侧Location选中所需的路径,或直接在框里命名 2,现在,你有了一个Django项目 你需要单击左下方的Terminal 创建一个app,命令:python  manage.py startapp Myapp(命名不做要求) 创建一个存放静态文件的文件夹:static(默认为该命名) 项目如下: 3,在W

  • 通用的Django注册功能模块实现方法

    注册功能实现 forms组件进行表单验证: 用户头像前端实时展示: ajax发送post请求: 应用forms组件实现用户输入信息的校验.首先在app目录下创建一个myform.py的文件. 如果你的项目至始至终只用到一个forms组件那么你可以直接建一个py文件书写即可. 但是如果你的项目需要使用多个forms组件,那么你可以创建一个myforms文件夹在文件夹内,根据forms组件功能的不同创建不同的py文件. regform.py loginform.py userform.py orde

  • Python Django 实现简单注册功能过程详解

    项目创建略,可参考Python Django Vue 项目创建. 目录结构如下 编辑views.py from django.shortcuts import render # Create your views here. from django.http import HttpResponse from django.shortcuts import render from common.DBHandle import DataBaseHandle import time def djang

  • Django用户登录与注册系统的实现示例

    1.1.创建项目和app django-admin startproject mysite_login python manage.py startapp login 1.2.设置时区和语言 Django默认使用美国时间和英语,在项目的settings文件中,如下所示: LANGUAGE_CODE = 'en-us' TIME_ZONE = 'UTC' USE_I18N = True USE_L10N = True USE_TZ = True 我们把它改为亚洲/上海时间和中文 LANGUAGE_

  • django的登录注册系统的示例代码

    摘要 django框架本身自带有登录注册,也可以自己写登录注册,下面将介绍这这2种方式实登录注册 一.自己写登录注册登出 1.注册regist 注册采用的是form表单,提交到数据库,在登录的时候,查询数据看,看用户有没有注册,如果用户没有注册,则返回注册页面注册 (1)models.py文件里创建相关的字段: 用户名字/用户密码/cookies携带的ticket from django.db import models # Create your models here. class User

  • django+vue实现注册登录的示例代码

    注册 前台利用vue中的axios进行传值,将获取到的账号密码以form表单的形式发送给后台. form表单的作用就是采集数据,也就是在前台页面中获取用户输入的值.numberValidateForm:前台定义的表单 $axios使用时需要在main.js中全局注册,.then代表成功后进行的操作,.catch代表失败后进行的操作 submitForm(formName) { let data = new FormData() data.append('username',this.number

  • Django怎么在admin后台注册数据库表

    django在admin后台注册自己创建的数据库表,这样我们就可以在admin后台看到表结构信息,我们就可以在admin后台快速录入表记录信息 如果没有注册,那么你在登录django自带的admin的后台,就看不到我们创建的表结构 登陆django的admin的后台会出现以下界面 这个时候需要把自己创建的数据表也注册到admin中,这个时候就需要在数据表对应的app中找到admin.py文件 加入以下代码: from .models import UserProfile class UserPr

  • django 通过ajax完成邮箱用户注册、激活账号的方法

    一.图片验证码 django-simple-captcha配置 1.在pycharm中,File====>Settings====>Project:项目名====>Project Interpreter====>+====>搜django-simple-captcha 选择0.55以上版本,然后点install package 按钮进行安装 2.项目名/urls.py中添加代码: from django.urls import path,include ...... from

  • django 框架实现的用户注册、登录、退出功能示例

    本文实例讲述了django 框架实现的用户注册.登录.退出功能.分享给大家供大家参考,具体如下: 1 用户注册: from django.contrib import auth from django.contrib.auth.models import User from django.views.decorators.csrf import csrf_exempt from django.http import HttpResponseRedirect # 用户注册 @csrf_exempt

随机推荐