django2.0.6整合xadmin后台

作者: admin 分类: 开发那些事 发布时间: 2018-06-20 20:11

运行环境

预先安装好虚拟环境,搭建Python3.5环境:

mkvirtualenv django-docs -p python3

需要安装:
python3.5.3 + Django2.0.6 + xadmin

安装xadmin

两种安装方式:

方式1

pip install git+git://github.com/sshwsfc/xadmin.git@django2

官方包安装后项目启动显示django-formtools版本有问题,卸载后安装新版本即可:

pip uninstall django-formtools
pip install django-formtools==2.1

方式2:安装修复包

pip install git+git@github.com:xiaofeng283-t/xadmin.git@django2

创建Django项目

django-admin startproject djangodocs

配置settings.py

INSTALLED_APPS = [

    'xadmin',
    'crispy_forms',
    'reversion',
]

配置urls.py

import xadmin

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

启动项目

python manage.py runserver

启动成功!
打开网址:http://127.0.0.1:8000

同步数据表

安装mysql包:

pip install pymysql

配置启动文件__init__.py:

import pymysql

pymysql.install_as_MySQLdb()

配置settings.py数据库信息:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', 
        'NAME': 'DatabaseName',  # 数据库
        'USER': ‘USERNAME’,  # 用户名
        'PASSWORD': ‘PWD’, # 密码
        'HOST': '127.0.0.1', 
    }
}

同步数据表:

python manage.py makemigrations
python manage.py migrate

成功创建表
@创建表 | center | 0x0

创建管理员

$ python manage.py createsuperuser
Username (leave blank to use 'jervon'): admin
Email address: jervon@foxmail.com
Password:
Password (again):
This password is too short. It must contain at least 8 characters.
This password is too common.
Password:
Password (again):
Superuser created successfully.

密码长度至少8位

进入xadmin

重新启动项目,打开网址:http://127.0.0.1:8000/xadmin/

@xadmin演示  | center | 0x0

配置时区/字体

settings.py

LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
USE_TZ = False

@xadmin演示  | center | 0x0

定制

用户模块

有时候xadmin默认字段无法满足需求,就需要定制;
新建apps目录,存放创建的模块,创建users模块:

python startapp users

移动users模块到apps目录,修改models.py:

from django.contrib.auth.models import AbstractUser

class UserProfile(AbstractUser):
    nick_name = models.CharField(max_length=50, verbose_name=u'昵称', blank=True, null=True)
    birthday = models.DateField(verbose_name=u'生日', blank=True, null=True)
    address = models.CharField(max_length=100, verbose_name=u'地址', blank=True, null=True)
    age = models.IntegerField(verbose_name=u'年龄', blank=True, null=True)
    gender = models.CharField(max_length=10, choices=(('Female', u'女'), ('Male', '男')), verbose_name=u'性别', default='Male')
    image = models.ImageField(upload_to='images/%Y/%m', verbose_name=u'头像')

    class Meta:
        verbose_name = u'用户信息'
        verbose_name_plural = verbose_name

    def __unicode__(self):
        return self.username

创建adminx.py

import xadmin
from .models import UserProfile

class UserProfileAdmin(object):
    pass

xadmin.site.register(UserProfile, UserProfileAdmin)

配置settings.py

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

# 配置完上一步,这里就可以直接写模块名字,而不用加上`apps`路径了
INSTALLED_APPS = [
    ...
    'users',
]

同步数据结构:

python manage.py makemigrations users

报错:

xadmin.sites.AlreadyRegistered: The model UserProfile is already registered

解决办法见文末:问题1

继续同步数据表:

python manage.py makemigrations
python manage.py migrate

报错:

django.db.migrations.exceptions.InconsistentMigrationHistory: Migration reversion.0001_squashed_0004_auto_20160611_1202 is applied before its dependency users.0001_initial on database 'default'.

解决办法见文末:问题2

后台菜单

这个功能要实现的修改左侧菜单分类users,没有整合成功,目前不影响使用,先一并记录

apps/users/apps.py

from django.apps import AppConfig


class UserConfig(AppConfig):
    name = 'user'
    verbose_name = u'用户操作'

增加verbose_name = u'用户操作'

apps/users/init.py

default_app_config='apps.users.apps.UserConfig'

运行项目后报错

django.core.exceptions.ImproperlyConfigured: Cannot import 'user'. Check that 'apps.users.apps.UserConfig.name' is correct.

暂时没解决,解决后补充!

项目结构目录

.
├── config
└── djangodocs
    ├── apps
    │   └── users
    │       ├── __init__.py
    │       ├── admin.py
    │       ├── adminx.py
    │       ├── apps.py
    │       ├── migrations
    │       │   ├── __init__.py
    │       ├── models.py
    │       ├── tests.py
    │       └── views.py
    ├── djangodocs
    │   ├── __init__.py
    │   ├── settings.py
    │   ├── urls.py
    │   └── wsgi.py
    ├── manage.py
    └── static
         ├── admin
         └── xadmin

问题

问题1:xadmin.sites.AlreadyRegistered: The model UserProfile is already registered

完整错误提示:

xadmin.sites.AlreadyRegistered: The model UserProfile is already registered

解决:
修改adminx.py

# 先注销模块,再注册
xadmin.site.unregister(UserProfile)
xadmin.site.register(UserProfile, UserProfileAdmin)

问题2:django.db.migrations.exceptions.InconsistentMigrationHistory

完整错误提示:

django.db.migrations.exceptions.InconsistentMigrationHistory: Migration reversion.0001_squashed_0004_auto_20160611_1202 is applied before its dependency users.0001_initial on database 'default'.

原因:Django中有一个原生的User模型类,admin的模型依赖这个模型类,由于前面一个应用中的模型类User继承了AbstractUser类,所以提示这个错误。

解决方案:

删除数据库中 除了auth_user的其他表,然后重新来一次。

Operations to perform:
  Apply all migrations: admin, auth, contenttypes, reversion, sessions, users, xadmin
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0001_initial... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying users.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying reversion.0001_squashed_0004_auto_20160611_1202... OK
  Applying sessions.0001_initial... OK
  Applying xadmin.0001_initial... OK
  Applying xadmin.0002_log... OK
  Applying xadmin.0003_auto_20160715_0100... OK

@xadmin演示  | center | 0x0
重新创建超级管理员:

python manage.py createsuperuser

参考

xadmin开发文档

(完)

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

发表评论

电子邮件地址不会被公开。 必填项已用*标注