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了
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),
......
]
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:
注意下面圈出来的那些部分,都是在代码中定义的。