• Django3.0.3使用Xadmin


    下载地址:

    pip install https://codeload.github.com/sshwsfc/xadmin/zip/django2 -i https://pypi.douban.com/simple/

    注册应用:

    INSTALLED_APPS = [
        ...
        'xadmin',
        'crispy_forms',
        'reversion',
        ...
    ]
    
    # 修改使用中文界面
    LANGUAGE_CODE = 'zh-Hans'
    
    # 修改时区
    TIME_ZONE = 'Asia/Shanghai'

    xadmin有建立自己的数据库模型类,需要进行数据库迁移

    python manage.py makemigrations
    python manage.py migrate

    在总路由中添加xadmin的路由信息

    import xadmin
    xadmin.autodiscover()
    
    # version模块自动注册需要版本控制的 Model
    from xadmin.plugins import xversion
    xversion.register_models()
    
    urlpatterns = [
        path(r'xadmin/', xadmin.site.urls),
    ]

    给xadmin设置基本站点配置信息

    import xadmin
    from xadmin import views
    
    class BaseSetting(object):
        """xadmin的基本配置"""
        enable_themes = True  # 开启主题切换功能
        use_bootswatch = True
    
    xadmin.site.register(views.BaseAdminView, BaseSetting)
    
    class GlobalSettings(object):
        """xadmin的全局配置"""
        site_title = ""  # 设置站点标题
        site_footer = ""  # 设置站点的页脚
        menu_style = "accordion"  # 设置菜单折叠
    
    xadmin.site.register(views.CommAdminView, GlobalSettings)

    模型到xadmin中

    # 在当前子应用中创建adminx.py,添加如下代码
    # 轮播图
    from .models import BannerInfo
    class BannerInfoModelAdmin(object):
        list_display=["title","orders","is_show"]
    xadmin.site.register(BannerInfo, BannerInfoModelAdmin)

    修改后端xadmin中子应用名称

    # 子应用/apps.py
    class HomeConfig(AppConfig):
        name = 'home'
        verbose_name = '我的首页'
    
    # __init__.py
    default_app_config = "home.apps.HomeConfig"

    错误1

    # ImportError: cannot import name 'six'
    
    # 解决方法
    pip install six
    
    # 然后找到 Libsite-packages 下的six.py 复制到 django/utils下面
    
    # 问题解决

    错误2

    # ImportError: cannot import name 'python_2_unicode_compatible'
    
    from django.utils.encoding import force_text, python_2_unicode_compatible
    # 改为
    from django.utils.encoding import force_text
    from django.utils.six import python_2_unicode_compatible
    
    # 问题解决

    错误3

    # ModuleNotFoundError: No module named 'django.contrib.staticfiles.templatetags'
    
    if 'django.contrib.staticfiles' in settings.INSTALLED_APPS:
        from django.contrib.staticfiles.templatetags.staticfiles import static
    else:
        from django.templatetags.static import static
    
    # 改为
    
    # if 'django.contrib.staticfiles' in settings.INSTALLED_APPS:
    #     from django.contrib.staticfiles.templatetags.staticfiles import static
    # else:
    from django.templatetags.static import static
    
    # 问题解决

    错误4

    # TypeError: render() got an unexpected keyword argument 'renderer'
    
    # 跟随错误提示 djangoformsoundfield.py
    
            return widget.render(
                name=self.html_initial_name if only_initial else self.html_name,
                value=self.value(),
                attrs=attrs,
                renderer=self.form.renderer,
            )
    
    # 改为
    
            return widget.render(
                name=self.html_initial_name if only_initial else self.html_name,
                value=self.value(),
                attrs=attrs,
                # renderer=self.form.renderer,
            )
    
    # 问题解决

    错误5

    # ImportError: cannot import name 'SKIP_ADMIN_LOG' from 'import_export.admin' 
    
    # 找到:xadminpluginsimportexport.py
    
    # 将from import_export.admin import DEFAULT_FORMATS, SKIP_ADMIN_LOG, TMP_STORAGE_CLASS 大概在48行 
    
    # 改为
    
    from import_export.admin import DEFAULT_FORMATS, ImportMixin
    
    # 并且找到下面报错的地方
        def get_skip_admin_log(self):
            if self.skip_admin_log is None:
                return SKIP_ADMIN_LOG
            else:
                return self.skip_admin_log
    
        def get_tmp_storage_class(self):
            if self.tmp_storage_class is None:
                return TMP_STORAGE_CLASS
            else:
                return self.tmp_storage_class
    
    # 改为
    
        def get_skip_admin_log(self):
            if self.skip_admin_log is None:
                return ImportMixin.skip_admin_log
            else:
                return self.skip_admin_log
    
        def get_tmp_storage_class(self):
            if self.tmp_storage_class is None:
                return ImportMixin.tmp_storage_class
            else:
                return self.tmp_storage_class

    注意:

    INSTALLED_APPS = [
    
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
    
        'xadmin',
        'crispy_forms',
        'corsheaders',
        'rest_framework',
    
        'home',
    ]
    
    # 在注册APP的时候 crispy_forms 要放在 xadmin下面否则会报错

     

  • 相关阅读:
    NOIp2014 Day2T3 解方程 秦九韶算法
    Luogu P1082 同余方程 拓展欧几里得
    Luogu P1351 联合权值 前缀和
    [USACO06JAN]冗余路径Redundant Paths 无向图tarjan缩点
    P1073 最优贸易 dp
    LOJ #6279. 数列分块入门 3
    LOJ #6278. 数列分块入门 2
    分块
    字典树Trie
    KMP
  • 原文地址:https://www.cnblogs.com/wtil/p/12363875.html
Copyright © 2020-2023  润新知