python 框架 Django 实战商城项目之用户模块创建

本贴最后更新于 1749 天前,其中的信息可能已经水流花落

创建用户 APP

整个项目会存在多个应用,需要存放在一个单独的文件包了,所以新建一个 apps 目录,管理所有子应用。

iShot2020030910.53.14.png

在 apps 包目录下穿件 users 应用

  python ../../manage.py startapp users

这个时候呢,需要我们将新创建的应用注册到 django 里,可是这里我们修改了应用的管理目录,与默认的方式不同,如果还按照之前的方式注册 APP 肯定会报错,这个时候我们可以先查看一下 django 的导包路径,在 dev 文件中输入

 print(sys.path()) # 输出包的所有搜索路径

 ['/Users/xxxx/workspace/xxxx/mall/immortal_mall',   
  '/Users/xxxx/workspace/xxxx/mall',   
  '/Users/xxxx/workspace/xxxx/mall/venv/lib/python38.zip',   
  '/Users/xxxx/workspace/xxxx/mall/venv/lib/python3.8',   
  '/Users/xxxx/workspace/xxxx/mall/venv/lib/python3.8/lib-dynload',   
  '/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8',   
  '/Users/xxxx/workspace/xxxx/mall/venv/lib/python3.8/site-packages',   
  '/Applications/PyCharm.app/Contents/helpers/pycharm_matplotlib_backend']

第一个路径就是我们 django 项目的主目录,
iShot2020030911.14.55.png

也就是说他会搜索主目录下的所有包,那么就可以定义 APP 的路径为

 meiduo_mall.apps.users

这个时候运行程序,是可以运行成功的。但是呢,这样定义注册 APP 的方式太麻烦了,如果应用多的话,每个都要这样写一遍,那不得烦死。所以必须得简化。怎么简化,直接往包的搜索路径中插入 apps 目录的绝对路径,那不 django 可以搜索到了么。

 sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))

就这样完事儿,然后注册 APP


 INSTALLED_APPS = [  
  'django.contrib.admin',  
  'django.contrib.auth',  
  'django.contrib.contenttypes',  
  'django.contrib.sessions',  
  'django.contrib.messages',  
  'django.contrib.staticfiles',  
  # 'immortal_mall.apps.users',  
  'users'  
 ]

返回注册页面

准备注册所使用的的模板,放入预先新建好的 templates 文件夹中
iShot2020030911.26.31.png

定义用户注册视图类:

class RegisterView(View):  
 """用户注册视图类"""  
​  
 def get(self, request):  
 '''获取注册页面'''  
 return render(request, 'register.html')

定义用户注册路由

 # 总路由  
 urlpatterns = [  
  path('admin/', admin.site.urls),  
  path('', include(('users.urls', 'users'), namespace='users'))  
 ]

这里要划重点了,include 函数的第一个参数是一个元祖,第一个参数没得说,就是指定了子应用的路由,第二个参数是 app_name,这里必须制定 app_name,如果不指定这个参数,写成 include('users.urls', namespace='users') 是会报错的。

当然还有一种指定方式就是在子应用的 urls 文件中中指定 app_name='users'.

在 users 应用目录下新建一个 urls.py 文件,然后写入路由信息

 urlpatterns = [  
  path('register/', views.RegisterView.as_view(), name='register')  # name添加命名空间  
 ]

启动应用,浏览器请求 http://127.0.0.1:8989/register/,返回注册页面。

用户模型类

项目使用的是 django 自带的用户认证系统,先来了解一下都有哪些功能。

Django 默认用户认证系统

django 自带用户认证系统可以处理用户账号、组、权限以及基于 cookie 的用户会话,位于 django.contrib.auth

包中。

auth 包是 django 内置的一个 APP,和 admin 一样,可以同时处理认证和授权,认证就是验证一个用户是不是系统的人,授权决定了一个认证的用户可以被允许做什么。

Django 认证系统中提供了用户模型类 User 保存用户的数据,User 对象是认证系统的核心**:**


 class User(AbstractUser):  
  """  
  Users within the Django authentication system are represented by this  
  model.  
 ​  
  Username and password are required. Other fields are optional.  
  """  
  	class Meta(AbstractUser.Meta):  
  		swappable = 'AUTH_USER_MODEL'

Userl 类没什么,看看父类 AbstractUser 中的东西,里面定义用户的一些字段,里面包括 user 类一些必填的字段 username、password,还有其他一些非必填的字段,is_active,is_staff 等,关于用户认证的方法都 AbstractUser 的父类 AbstractBaseUser 中,

不过 AbstractUser类 中持有了 UserManager 的实例叫做 objects,这个类提供了创建用户的方法,比如:

user = User.objects.create_user(username, email, password, **extra_fields)

自定义用户模型类

图片

这是用户注册信息表单,有一个手机号的字段,但是 Django 提供放入用户模型中是没有这个字段的,需要我们自己定义。

 class User(AbstractUser):  
  """自定义用户模型类"""  
 	 mobile = models.CharField(max_length=11, unique=True, verbose_name="手机号")  
 ​  
  	class Meta:  
  		db_table = 'tb_user' # 自定义表名  
  		verbose_name = "用户"  # 站点显示  
  		verbose_name_plural = verbose_name # 复数显示

自定义的用户模型类需要继承 AbstractUser 类,然后指定新添加的字段。添加完后运行项目,会报一个错:

iShot2020030913.16.07.png

这是 django 系统默认的的认证对象配置,我们使用了自定义的对象,但是这个对象没有被指定给系统,

iShot2020030913.22.33.png

所以要在自己的 dev 配置文件中重新指定

 AUTH_USER_MODEL = 'users.User'

然后创建迁移文件,执行迁移命令,完成表的创建。

 ✗ python manage.py makemigrations  
 ​  
  python manage.py migrate
  • Django
    47 引用 • 72 回帖 • 4 关注
  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    545 引用 • 672 回帖
  • 测试开发
    11 引用 • 5 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...