Xadmin是django admin的替换方案,对admin做了一些扩展,支持添加插件,界面基于bootstrap开发,更加漂亮。


Django 集成Xadmin_第1张图片

Django 集成Xadmin_第2张图片

Django 集成Xadmin_第3张图片








一、用pycharm创建一个my_xadmin项目

Django 集成Xadmin_第4张图片



二、安装必须的依赖组件

1、打开pycharm终端安装1.x版本django

pip install django


2.安装xadmin

    由于用的是django2的版本,所以这里用django2的分支

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

      直接clone下载比较久,也可以直接下载包后本地安装  https://github.com/sshwsfc/xadmin/tree/django2

pip install --cache-dir . C:\Users\eirc\Downloads\xadmin-django2.zip


Django 集成Xadmin_第5张图片





三、配置运行xadmin


    1、修改settings.py



#     引入下面三个app
INSTALLED_APPS = [
    ....
    'xadmin',
    'crispy_forms',
    'reversion', 
]

......
## 修改使用中文界面
LANGUAGE_CODE = 'zh-Hans'

......

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


需要再项目根目录下创建static,collect_static两个目录


2、配置xadmin路由,修改urls.py

import xadmin
from django.urls import path

xadmin.autodiscover()

# model自动注册
from xadmin.plugins import xversion

xversion.register_models()

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


3、创建数据库并创建超级用户

python manage.py migrate
python manage.py createsuperuser


4、拉取静态文件到本地

python manage.py collectstatic


5、运行并访问后台

python manage.py runserver

#     使用创建的超级用户登录


Django 集成Xadmin_第6张图片


Django 集成Xadmin_第7张图片



四、添加一个App,实现model的curd功能

1、添加一个IDC机房管理app,并在settings.py中加入IdcManager 

python manager.py startapp IdcManager


2、添加一个model

class IDC(models.Model):
    name = models.CharField('名称',unique=True,max_length=50)
    addr = models.CharField('地址',max_length=128)
    tel = models.CharField('电话',max_length=50)
    note = models.TextField(null=True,blank=True)
    expire = models.DateTimeField('到期')
    create_datetime = models.DateTimeField('创建时间',auto_now=True)

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = 'IDC机房'
        verbose_name_plural = verbose_name


3、打开IdcManager的__init__.py文件添加:

default_app_config = 'IdcManager.apps.IdcmanagerConfig'


4、修改apps.py文件

from django.apps import AppConfig


class IdcmanagerConfig(AppConfig):
    name = 'IdcManager'
    verbose_name = 'IDC管理'


5、修改admin.py

import xadmin

from .models import IDC

@xadmin.sites.register(IDC)
class IDCAdmin(object):
    list_display = ("name", "addr", "tel", "expire", "create_datetime","note")
    # 带链接字段,点击进入编辑
    list_display_links = ("name",)



6、创建表并启动测试

python manage.py makemigrations
python manage.py migrate
python manage.py runserver



Django 集成Xadmin_第8张图片



Django 集成Xadmin_第9张图片




五、外键关联以及用户关联


1、model添加一个server,关联用户以及idc机房

class Server(models.Model):
    # 关联当前登录用户
    user = models.ForeignKey(User,on_delete=models.CASCADE,editable=False,verbose_name='最后编辑人')
    # 关联idc机房
    idc = models.ForeignKey(IDC,on_delete=models.CASCADE,verbose_name='IDC')
    ip = models.GenericIPAddressField('IP')
    cabin = models.CharField('机架位',max_length=128)
    active = models.BooleanField('有效',default=True)
    create_time = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.ip

    class Meta:
        verbose_name = '服务器'
        verbose_name_plural = verbose_name


2、admin.py 添加注入模板,注意save_models这里通过修改原先的方法来实现自定义修改字段

@xadmin.sites.register(Server)
class ServerAdmin(object):
    list_display = ("ip", "idc", "cabin", "user", "active" ,'create_time')
    list_display_links = ("ip",)

    def save_models(self):
        self.new_obj.user = self.request.user
        super().save_models()



3、启动并测试


python manage.py makemigrations
python manage.py migrate
python manage.py runserver




Django 集成Xadmin_第10张图片

Django 集成Xadmin_第11张图片


4、根据登录用户过滤显示选项

    修改 admin.py 中server的定义方式如下,同时去掉自动注入方式,因为如果使用自定义的queryset方法,不支持自动注入

class ServerAdmin(object):
    list_display = ("ip", "idc", "cabin", "user", "active" ,'create_time')
    list_display_links = ("ip",)

    def save_models(self):
        self.new_obj.user = self.request.user
        super().save_models()

    def queryset(self):
        qs = super( ServerAdmin, self ).queryset()
        if self.request.user.is_superuser:
            return qs
        else:
            return qs.filter( create_user=self.request.user )

xadmin.sites.site.register( Server, ServerAdmin )


这样修改完后重启项目,就可以看到根据登录的用户,看到的选项不一样



六、总结

    xadmin确实比django admin漂亮很多,也对扩展的支持很好,用起来很舒服。但官方的文档实在是渣渣,痛苦,故记录在这里,方便以后可以查阅