【Django学习笔记】10:引入XAdmin后台管理系统,创建用户模型

简述

XAdmin是在Django强大的Admin后台管理基础上开发的一个第三方库,用于代替Admin,其界面更加舒适,功能更加强大。

不论是使用Admin还是XAdmin,既然是后台管理,就要涉及到超级用户,也就涉及到了用户表,所以这里在使用时还要定义好用户Model。

安装

安装适合于Django2的XAdmin:

pip install https://codeload.github.com/sshwsfc/xadmin/zip/django2

创建用户模型

这部分是学习MxShop项目时的一个具有完整的基本功能的用户模型。

users/models.py

用户一张表(超级用户也是放在这个表里),短信验证码一张表。

# 系统的包
from datetime import datetime

# 第三方包
from django.contrib.auth.models import AbstractUser
from django.db import models

# 自己的包
pass


class UserProfile(AbstractUser):
    """用户,由手机号标识"""
    GENDER_CHOICES = (
        ("male", u"男"),
        ("female", u"女")
    )
    # 用户注册时用的是mobile,没提供name之类的信息,所以可以为null
    # 注意null针对数据库,blank针对表单
    name = models.CharField(max_length=30, null=True, blank=True, verbose_name="姓名")
    birthday = models.DateField(null=True, blank=True, verbose_name="出生年月")
    gender = models.CharField(max_length=6, choices=GENDER_CHOICES, default="female", verbose_name="性别")
    # 这里如果设置成不允许为null,那么在用户注册的Serializer里因为用了ModelSerializer,就要求mobile是必填的
    mobile = models.CharField(null=True, blank=True, max_length=11, verbose_name="电话", help_text="电话号码")
    email = models.EmailField(max_length=100, null=True, blank=True, verbose_name="邮箱")

    class Meta:
        verbose_name = "用户"
        verbose_name_plural = verbose_name

    # py2里才有string转Unicode,py3里默认都是Unicode,直接用__str__()
    def __str__(self):
        return self.username


class VerifyCode(models.Model):
    """
    短信验证码,由手机号关联,回填验证码进行验证。可以保存在redis中
    """
    code = models.CharField(max_length=10, verbose_name="验证码")
    mobile = models.CharField(max_length=11, verbose_name="电话")
    add_time = models.DateTimeField(default=datetime.now, verbose_name="添加时间")

    class Meta:
        verbose_name = "短信验证"
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.code

users/apps.py

在这里添加元数据和配置信号量。下面的"用户管理"会展示在XAdmin后台管理系统的左侧导航栏里,下面的信号量表示对用户模型使用某些操作时触发的拦截处理。

from django.apps import AppConfig


class UsersConfig(AppConfig):
    name = 'users'
    verbose_name = "用户管理"

    def ready(self):
        # 在这里配置信号量
        import users.signals

users/signals.py

这是users这个app的信号量的配置文件,当对这个app中的Model发生特定的操作时,会触发这个信号量中特定的方法。

这里是当创建用户前拦截一下,将用户提交的密码加密之后再存到数据库里。

然而对于createsuperuser而言,这是多此一举的,会导致密码被再次加密,这样创建出来的超级用户就没法在XAdmin上正确登录了。所以在创建超级用户时只要配置一下settings.py里users的app,让它不走这条路线就行了。

"""
注意在app.js中要在ready中导入本文件

各种信号量见:
https://www.cnblogs.com/renpingsheng/p/7566647.html
"""
from django.conf import settings
from django.db.models.signals import post_save
from django.dispatch import receiver
from rest_framework.authtoken.models import Token

from django.contrib.auth import get_user_model

User = get_user_model()


# 参数一接收哪种信号,参数二是接收哪个model的信号
@receiver(post_save, sender=User)
def create_user_password(sender, instance=None, created=False, **kwargs):
    """User对象保存后自动触发"""
    # 是否新建,因为update的时候也会进行post_save
    # 这里只有在新建的时候才去把password从明文该成密文再存到数据库里
    if created:
        password = instance.password
        instance.set_password(password)
        instance.save()  # 注意这个save又会触发post_save,但已经不满足created==True了

配置XAdmin

settings.py

确保注册了这些app:

INSTALLED_APPS = [
	......
	'django.contrib.admin',
	'crispy_forms',
	'reversion',
	'xadmin',
]

语言和时间的配置:

# 语言改为中文
LANGUAGE_CODE = 'zh-hans'

# 时区改为上海
TIME_ZONE = 'Asia/Shanghai'

USE_I18N = True

USE_L10N = True

# 数据库存储使用时间,True时间会被存为UTC的时间
USE_TZ = False

配置存放静态资源的目录:

STATIC_URL = '/static/'

# 添加下面static目录定义
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, "static"),
)

配置使用的用户Model:

# 替换Django默认的用户模型
AUTH_USER_MODEL = 'users.UserProfile'

urls.py

from django.urls import path

import xadmin
from xadmin.plugins import xversion

# model自动注册
xadmin.autodiscover()
xversion.register_models()

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

Django指令操作

持久化到数据库

makemigrations
migrate

创建超级用户

本来应该这样注册users这个app,才能使用到元数据和信号量:

INSTALLED_APPS = [
	......
	'users.apps.UsersConfig',
]

这一步时,暂时让users的app不走信号量路线,即这样配置:

INSTALLED_APPS = [
	......
	'users',
]

这样就不会因为前面定义的那个信号量,使得创建超级用户时密码被再次加密。

createsuperuser

拉取静态文件

Admin、XAdmin、DRF这样的框架都会涉及到网页界面的问题,这些界面所使用的JS、CSS、图片等就是这一步要拉取的静态文件。

collectstatic

配置users/adminx.py

这一部分相当于Admin管理系统的users/admin.py,即可以在这里对XAdmin后台管理系统的界面做一些详细的配置。

import xadmin
from xadmin import views
from users.models import VerifyCode


class BaseSetting(object):
    enable_themes = True
    use_bootswatch = True


class GlobalSettings(object):
    site_title = "DRFStudy项目"
    site_footer = "copyright©XXX"
    # menu_style = "accordion"


class VerifyCodeAdmin(object):
    list_display = ['code', 'mobile']  # VerifyCode默认的显示列


xadmin.site.register(VerifyCode, VerifyCodeAdmin)
xadmin.site.register(views.BaseAdminView, BaseSetting)
xadmin.site.register(views.CommAdminView, GlobalSettings)

运行结果

运行,访问http://127.0.0.1:8000/xadmin/登录XAdmin:
【Django学习笔记】10:引入XAdmin后台管理系统,创建用户模型_第1张图片
注意下面圈出来的那些部分,都是在代码中定义的。
【Django学习笔记】10:引入XAdmin后台管理系统,创建用户模型_第2张图片

你可能感兴趣的:(#,Django)