【Python百日进阶-WEB开发】Day172 - Django案例:04用户模型类

2023-11-12

文章目录

一、创建用户模块子应用

1.1 新建apps包

在项目主文件夹(第二层meiduo_mall)中创建apps包,用于管理所有的子应用,包中包括或创建 init.py文件

1.2 新建子应用

(meiduo_mall) PS E:\projects\meiduo_project\meiduo_mall\meiduo_mall\apps> python …\manage.py startapp users

1.3 查看导包路径

import sys
print(sys.path)

输出列表
[‘E:\projects\meiduo_project\meiduo_mall’, ‘c:\python39\python39.zip’, ‘c:\python39\DLLs’, ‘c:\python39\lib’, ‘c:\python39’, ‘E:\projects\meiduo_project\meiduo_mall’, ‘E:\projects\meiduo_project\meiduo_mall\lib\site-packages’]
说明:

  • 第1项就是当前工程的虚拟环境
  • 最后1项就是虚拟环境的扩展包路径,其中包括django等扩展包
  • 上述列表中的任意一项都可以作为导包的起点,只需从其下级目录开始逐级指定路径就可以了。
    如:用户子应用绝对路径为: ‘E:\projects\meiduo_project\meiduo_mall\meiduo_mall\apps\users’
    导包路径为:‘meiduo_mall.apps.users’

1.4 注册子应用

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'meiduo_mall.apps.users',   # 注册子应用
]

二、追加导包路径

2.1 为什么要追加导包路径

  • 可以尽快的适应接过来的项目
  • 通过追加导包路径,可以简化某些目录复杂的导包方式

2.2 查看当前的导包根路径

import os,sysy
BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
#查看项目BASE_DIR(自我认为是跟路径)
print(BASE_DIR)

2.3 追加导包路径

# 追加导包路径
sys.path.insert(1, os.path.join(BASE_DIR, 'apps'))

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # 'meiduo_mall.apps.users',   # 注册子应用
    'users',   # 注册子应用
]

在这里插入图片描述

三、展示用户注册页面

3.1 编写html代码

在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>商城-注册</title>
    <!-- 添加静态文件 -->
    <link rel="stylesheet" type='text/css' href="{{ static('css/reset.css') }}">
    <link rel="stylesheet" type='text/css' href="{{ static('css/main.css') }}">
    <!-- <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script> -->
    <script type="text/javascript" src="../static/js/vue_2.6.14.min.js"></script>
    <!-- <script type="text/javascript" src="{{ static('js/vue_2.6.14.min.js') }}"></script> -->
    <script type="text/javascript" src="{{ static('js/axios_0.21.1.min.js') }}"></script>
    
    <style>
        [v-cloak] {
            display: none;
            }
    </style>
</head>
<body>
    <!-- Vue需要控制整个页面,id="app" -->
    <div id="app">
        <div class="register_con">
            <div class="l_con fl">
                <a href="index.html" class="reg_logo"><img src="../static/images/logo.png" alt=""></a>
                <div class="reg_slogan">人美货全</div>
                <div class="reg_banner"></div>
            </div>
        </div>
        <div class="r_con fr">
            <div class="reg_title clearfix">
                <h1>用户注册</h1>
                <a href="login.html">登录</a>
            </div>
            <div class="reg_form clearfix">
                <!-- 前端需要用submit事件监听用户是否提交表单。v-cloak限定页面等待所有变量渲染成功再一起展示给用户,避免用户看到前端页面源码 -->
                <form method="post" class="register_form" @submit="on_submit" v-cloak>
                    <!-- csrf隐藏域,用于通过后端服务器的csrf验证 -->
                    {{ csrf_input }}
                    <ul>
                        <li>
                            <label for="">用户名:</label>
                            <!-- v-model用于接收用户数据 @blur用于定义鼠标失去焦点事件 -->
                            <input type="text" v-model="username" @blur="check_username" name="username" id="user_name">
                            <!-- v-show布尔型,用于显示用户名是否合法的判断结果,{{ error_name_message }}用于显示不同类型的错误信息 -->
                            <span class="error_tip" v-show="error_name">[[ error_name_message ]]</span>
                        </li>
                        <li>
                            <label for="">密码:</label>
                            <input type="password" v-model="password" @blur="check_password" name="password" id="pwd">
                            <span class="error_tip" v-show="error_password">请输入8-20位密码</span>
                        </li>
                        <li>
                            <label for="">确认密码:</label>
                            <input type="password" v-model="password2" @blur="check_password2" name="password2" id="pwd2">
                            <span class="error_tip" v-show="error_password2">两次输入的密码不一样</span>
                        </li>
                        <li>
                            <label for="">手机号:</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 for="">图形验证码:</label>
                            <input type="text" v-model="image_code" @blur="check_image_code" name="image_code" id="msg_input">
                            <img v-bind:src="image_code_url" @click='generate_image_code' alt="图形验证码" class="pic_code">
                            <span class="error_tip" v-show="error_image_code">[[ error_image_code_message]]</span>
                        </li>
                        <li>
                            <label for="">短信验证码</label>
                            <input type="text" v-model="sms_code" @blur="check_sms_code" name="sms_code" id="sms_code" class="msg_input">
                            <a @click="send_sms_code" class="get_msg_code">[[ sms_code_tip ]]</a>
                            <span class="error_tip" v-show="error_sms_code">[[ error_sms_code_message]]</span>
                        </li>
                        <li class="agreement">
                            <!-- 复选框checkbox没有blur事件,状态改变使用change事件 -->
                            <input type="checkbox" v-model="allow" @change="check_allow" name="allow" id="allow">
                            <label for="">同意“商城用户使用协议”</label>
                            <span class="error_tip" v-show="error_allow">请勾选用户协议</span>
                        </li>
                    </ul>
                    <input type="submit" value="注册">
                    {% if register_errmsg %}
                        <span class="error_tip">{{ register_errmsg }}</span>
                    {% endif %}
                </form>
            </div>
        </div>
    </div>
    <script type="text/javascript" src="../static/js/common.js"></script>
    <script type="text/javascript" src="../static/js/register.js"></script>
</body>
</html>

3.2 编写视图文件代码

from django.shortcuts import render
from django.views import View

# Create your views here.
class ResgisterView(View):
    """ 用户注册 """
    def get(self, request):
        """ 用于提供数据--用户注册页面 """
        return render(request, 'register.html')

3.3 定义路由

3.3.1 项目主路由

from django.contrib import admin
from django.urls import path, include
from meiduo_mall.apps.users import urls as users_urls

urlpatterns = [
    path('admin/', admin.site.urls),

    # users
    path('', include(users_urls, namespace='users')),
]

3.3.2 用户模块子路由

from django.urls import path
from . import views

app_name = 'users'

urlpatterns = [
    # 用户注册: reverse(users:register) == '/register/'
    path('register/', views.ResgisterView.as_view(), name='register'),  
]

3.3.3 访问用户注册页面

在这里插入图片描述
没有css好丑啊

3.3 命名空间

四、用户模型类

4.1 定义用户模型类

目的:迁移建表,并以ORM面向对象的形式增删改查用户数据

4.1.1 方案一:自定义用户模型类

  • 优点:灵活,一般用于扩充django默认的
  • 缺点:考虑很难周全,设计工程庞大

4.1.2 方案二:使用django用户认证系统的用户模型类

  • 优点:拿来可用,关联好了庞大的用户体系,极大节省开发周期和成本
  • 缺点:灵活性差点

4.1.3 Django默认用户认证系统

  1. Django自带用户认证系统:它处理用户账号、组、权限以及基于cookie的用户会话。
  2. Djang认证系统位置
  • django.contrib.auth 包含认证框架的核心和默认的模型。
  • django.contrib.contenttypes 是 Django内容类型系统,它允许权限与你创建的模型关联。
  1. Django认证系统同时处理认证和授权
  • 认证:验证一个用户是否它声称的那个人,可用于账号登录。
  • 授权:授权决定一个通过了认证的用户被允许做什么。
  1. Django认证系统包含的内容
  • 用户:用户模型类、用户认证。
  • 权限:标识一个用户是否可以做一个特定的任务,MIS系统常用到。
  • 组:对多个具有相同权限的用户进行统一管理,M系统常用到。
  • 密码:一个可配置的密码哈希系统,设置密码、密码校验。

4.1.4 Django默认用户模型类

在这里插入图片描述

4.1.5 自定义用户模型类

  1. 思考:为什么要自定义用户模型类?
  • 观察注册界面会发现,商城注册数据中必选用户mobile信息
  • 但是 Django默认用户模型类中没有mobile字段,所以要自定义用户模型类
  1. 如何自定义用户模型类?
  • 继承自AbstractUser(可通过阅读Django默认用户模型类的源码得知)
  • 新增mobile字段
  1. users子应用的models.py
from django.db import models
from django.contrib.auth.models import AbstractUser

# Create your models here.

class User(AbstractUser):
    """ 自定义用户模型类 """
    mobile = models.CharField(max_length=11, unique=True, verbose_name='手机号')

    class Meta:
        db_table = 'tb_users'    # 自定义表名
        verbose_name = '用户'   # admin站点中显示
        verbose_name_plural = verbose_name

    def __str__(self) -> str:
        return self.username

报错,需要在配置文件中指定用户自定义模型类
在这里插入图片描述

4.1.6 开发配置文件dev.py中指定自定义的用户模型类

# 指定自定义的用户模型类,值的语法为:'z子应用.用户模型类'
AUTH_USER_MODEL = 'users.User'

报错:需要迁移
在这里插入图片描述

4.2 迁移用户模型类

4.2.1 第一次迁移

  1. 生成迁移文件
    (meiduo_mall) PS E:\projects\meiduo_project\meiduo_mall> python manage.py makemigrations
    在这里插入图片描述
  2. 迁移数据库
    (meiduo_mall) PS E:\projects\meiduo_project\meiduo_mall> python manage.py migrate
    在这里插入图片描述

4.2.2 重启项目,没有错误了

在这里插入图片描述

4.2.3 vscode 连接数据库

在这里插入图片描述

4.2.4 查看自定义数据表

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Python百日进阶-WEB开发】Day172 - Django案例:04用户模型类 的相关文章

随机推荐

  • 考研刷题小程序

    2020年12月28号 今年的考研已于昨天结束 小肥羊携手考研刷题小程序 祝各位考研学子一战上岸 话说2020年我开发了一个考研刷题小程序 今天非常好奇 竟然还有人在刷题 在签到打卡 在邀请好友 1 这个刷题小程序从2020年年初开发到6月
  • JQ源码分析(环境处理)

    JQ可以在哪运行 浏览器 手机端app中 有window环境 不支持commonJS规范 支持es6 module规范 node环境 没有window 支持commonJS 但不支持Es6Module 可以用webpack进行编译 支持wi
  • c++中的vector容器(笔记练习)

    笔记 1 about vector vector是可变大小数组的序列容器 同数组一样 vector也采用连续存储空间存储元素 因此可采用下标对元素进行访问 与普通数组不同的是 它的大小是可动态改变 vector使用动态数组存储元素 与其它动
  • 【黑马程序员】MySQL 基础篇

    文章目录 前言 一 MySQL 概述 1 数据库相关概念 2 MySQL 数据库 1 版本 2 下载 3 安装 4 启动与停止 5 客户端连接 3 数据模型 1 关系型数据库 RDBMS 2 数据模型 二 SQL 1 SQL 通用语法 2
  • 企业应如何减少云配置错误?

    在当今技术驱动的环境中 大多数公司都会在云上拥有一些工作负载 与本地网络不同 这些云环境缺乏安全的外部边界和特定的关闭时间 云网络始终开启且始终可用 虽然方便 但这也意味着黑客可以随时访问它们 因此 这些网络中的任何漏洞 例如云配置错误 都
  • 项目回顾(一)-----原型的建立

    距离实习结束也有一段时间了 这段时间里我从前到后参加的过的一个项目 收获颇丰 故在博客中自我总结 积累经验 从了解到需求开始 就要开始着手思考功能 功能联系 数据存储等问题 根据客户的需求来进行原型的设计 这一步操作不单单是给客户一个样例
  • Java JDK动态代理

    Java JDK动态代理 一 代理是什么 二 示例 三 总结 一 代理是什么 代理是一种设计模式 被代理对象 真实对象 实现具体的服务方法 委托给代理来进行处理 代理类可以在被代理对象的方法上附加更多的处理 一般有静态代理和动态代理 区别在
  • Rancher部署Flink集群

    目录 一 添加flink conf yaml 二 配置flink jobmanager 三 配置flink taskmanager 一 添加flink conf yaml 资源 gt 配置映射 添加配置项
  • 解决npm install各种报错的6种方案 Error: Command failed: cmd.exe autoreconf -ivf以及gifsicle pre-build test fail

    解决npm install各种报错的6种方案 报错示例 方案零 刷新刷新 DNS 解析缓存 还有 可以尝试重启电脑 方案一 使用yarn 方案二 使用cnpm 方案三 修改配置host 方案四 这种解决其他报错比较多 修改npm源 方案五
  • Jmeter查看结果树之查看响应的13种详解方法

    Jmeter查看结果树查看响应有哪几种方法 可通过左侧面板底部的下拉框选择 01 Text 查看结果树中请求的默认格式为Text 显示取样器结果 请求 响应数据3个部分内容 取样器结果 默认Raw展示 可以切换为Parsed视图 表单展示更
  • 域名导向服务器 开源项目,让 Page 服务指向自己域名

    正常情况下如果只买了域名 但是没有买云主机 所以可以利用现有的 Page 服务并让域名跳转到该Page来实现 码云 自定义域名是收费的 但是服务文档 推荐 码云pro版自定义域名解析 Step 1 绑定你已备案的域名 Step 2 通过解析
  • hadoop,pySpark环境安装与运行实战《一》

    一 环境准备 环境最好再mac或者liunx环境搭建最为友好 不建议在windows上折腾 1 安装java jdk 下载java jdk 并在 bash profile配置 jdk mac路径查找方式 export JAVA HOME U
  • 后摩尔定律时代的芯片新选择!

    来源 gizmodo 摘要 很长一段时间以来 摩尔定律和它的最终结局一直就像房间里的大象 不容忽视 英特尔联合创始人戈登 摩尔在1965年的一篇论文中预测 芯片中的晶体管数量每年将翻一番 更多的晶体管意味着更快的速度 而这种稳定的增长推动了
  • jul177链接_「jul177小早川中文」无删减版高清天天影音第89集

    简介 一会儿 小早小早她走进来 小早小早看上去苍白而动摇 彼得 她说 去找丈夫而不是代替她在他对面 彼得 她颤抖的手放在他的手臂上 一世今天早上还没见过男孩 他们的床还没睡在 安静点 老兄 安静一下 坐下来吃点东西 沟通破坏了礼貌 但是当厄
  • 1G服务器网站,1核1g内存云服务器建网站

    1核1g内存云服务器建网站 内容精选 换一换 网站的访问与云服务器的网络配置 端口通信 防火墙配置 安全组配置等多个环节相关联 任意一个环节出现问题 都会导致网站无法访问 本节操作介绍网站无法访问时的排查思路 网站无法访问怎么办 如果打开网
  • 插优盘电脑计算机窗口闪,U盘插到电脑上,电脑怎么一闪一闪的?

    2009 05 08 我的U盘一直是好的 今天U盘插进电脑后 U盘灯闪几秒就熄灭了 不能读取 我怎么办 真是着急 请高手解答 非常感谢 U盘正规的是在插上后灯闪烁一下 在没有动作的情况下就不会亮 向盘里考资料 软件 音乐等任何文件时候 灯闪
  • dockfile概述,使用dockerfile构建Nginx,Tomcat镜像

    dockfile概述 使用dockerfile构建Nginx Tomcat镜像 一 镜像分层 1 1 docker 三要素 1 2 创建容器的几种方式 1 3 镜像所包含的部分 1 4 镜像的分层 二 dockerfile分层原理 2 1
  • http接口加密《一》:移动应用中,通过在客户端对访问的url进行加密处理来保护服务器上的数据...

    来源 http meiyitianabc blog 163 com blog static 10502212720131056273619 我认为 保护服务器端的数据 有这么几个关键点 不能对使用体验产生影响 这就排除掉了诸如每次接口调用都
  • 【STM32】keil使用sprintf时的告警处理

    使用如下语句 u8 DispBuf 50 sprintf DispBuf TEST 时 会出现如下告警 main c 86 warning 223 D function sprintf declared implicitly 这是由于没有包
  • 【Python百日进阶-WEB开发】Day172 - Django案例:04用户模型类

    文章目录 一 创建用户模块子应用 1 1 新建apps包 1 2 新建子应用 1 3 查看导包路径 1 4 注册子应用 二 追加导包路径 2 1 为什么要追加导包路径 2 2 查看当前的导包根路径 2 3 追加导包路径 三 展示用户注册页面