Xadmin是django admin的替换方案,对admin做了一些扩展,支持添加插件,界面基于bootstrap开发,更加漂亮。
一、用pycharm创建一个my_xadmin项目
二、安装必须的依赖组件
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
三、配置运行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 # 使用创建的超级用户登录
四、添加一个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
五、外键关联以及用户关联
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
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漂亮很多,也对扩展的支持很好,用起来很舒服。但官方的文档实在是渣渣,痛苦,故记录在这里,方便以后可以查阅