• Django2.1集成xadmin管理后台所遇到的错误集锦,解决填坑


    django默认是有一个admin的后台管理模块,但是丑,功能也不齐全,但是大神给我们已经集成好了xadmin后台,我们拿来用即可,但是呢,django已经升级到2.1版本了,xadmin貌似跟不上节奏,那么在集成过程中咱就一步一步填坑吧,这也是一种学习的过程,遇到错误,找到错误的地方,看看django最新升级都修改了那些,去掉了那些,把相应出错的地方替换即可。

    xadmin源码地址:https://github.com/sshwsfc/xadmin

    下载并解压:

    我们用到的是xadmin文件夹,将xadmin复制到项目的根目录,与项目同级别。

    安装依赖库:

    激活项目的虚拟环境,cd 到解压的 xadmin-master目录,运行一下代码

    1
    pip3 install -r requirements.txt

    在项目settings.py设置文件中引入:

    在项目的urls.py中设置

    然后运行:python manage.py makemigrations 建立数据库迁移文件

    这个时候就会引出一系列的错误提示

    错误一:关联关系ForeignKey引发的错误,打开xadmin文件中的模型文件models.py

    凡是出现关联关系字段的地方全部加上 on_delete=models.CASCADE , 如下图所示:

    错误二:模块包名称合并修改引发的错误

    错误提示:ModuleNotFoundError: No module named 'django.core.urlresolvers' 

    这是因为django2.1把from django.core.urlresolvers修改成了django.urls

    那么如图所示将 from django.core.urlresolvers import NoReverseMatch, reverse 

    修改为:from django.urls import NoReverseMatch, reverse

    错误三:出现如下错误提示

    这是因为,django2.1.1的 forms表单初始化仅一个参数,将 forms.Field.__init__(self, required, widget, label, initial, help_text, *args, **kwargs) 修改为如图所示:

    错误四:ImportError: cannot import name 'login' from 'django.contrib.auth.views' 

    解决办法:

    复制代码
    # 将 website.py 中的
    from django.contrib.auth.views import login
    from django.contrib.auth.views import logout
    
    
    # 修改为
    from django.contrib.auth import authenticate, login, logout
    复制代码

    错误五:ImportError: cannot import name 'QUERY_TERMS' from 'django.db.models.sql.query'

     

    解决办法:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # django2.1.1版本将xadminpluginsfilters.py文件中的
    from django.db.models.sql.query import LOOKUP_SEP, QUERY_TERMS
     
    # 修改为
    from django.db.models.sql.query import LOOKUP_SEP, Query
     
     
    # 在Django2.0版本中把
    from django.db.models.sql.query import LOOKUP_SEP, QUERY_TERMS
     
    # 修改为:
    from django.db.models.sql.query import LOOKUP_SEP
    from django.db.models.sql.constants import QUERY_TERMS

    错误六:ModuleNotFoundError: No module named 'django.contrib.formtools'   导入fromtools错误,版本太低

    解决方案:

    1
    2
    3
    4
    5
    # 卸载旧版本
    pip uninstall django-formtools
     
    # 安装新版本
    pip install django-formtools

    错误七:

    解决方案:

    1
    2
    3
    4
    5
    # 把xadminpluginspassword.py中的
    from django.contrib.auth.views import password_reset_confirm
     
    修改为:
    from django.contrib.auth.views import PasswordResetConfirmView

    再把位于75行左右  return后的  password_reset_confirm修改为 PasswordResetConfirmView,如下图所示

     错误八:AttributeError: 'Settings' object has no attribute 'MIDDLEWARE_CLASSES'

    解决办法:

    1
    2
    3
    4
    5
    6
    7
    # 将xadminpluginslanguage.py 中的
     
    if settings.LANGUAGES and 'django.middleware.locale.LocaleMiddleware' in settings.MIDDLEWARE_CLASSES:
     
    修改为:
     
    if settings.LANGUAGES and 'django.middleware.locale.LocaleMiddleware' in settings.MIDDLEWARE:

    最后运行:python manage.py makemigrations 创建迁移数据文件

    再运行:python manage.py migrate 迁移数据库

    如果在以上过程中出现类似错误,请依照错误相应修改,错误提示的先后顺序或许不一样,但是请仔细阅读错误提示代码。

    错误九

    ImportError: cannot import name 'QUERY_TERMS'

    错误日志(error log)

      File "<frozen importlib._bootstrap>", line 994, in _gcd_import
      File "<frozen importlib._bootstrap>", line 971, in _find_and_load
      File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
      File "<frozen importlib._bootstrap>", line 665, in _load_unlocked
      File "<frozen importlib._bootstrap_external>", line 678, in exec_module
      File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
      File "E:py_virtualenvjoyoolibsite-packagesdjango_filters\__init__.py", line 4, in <module>
        from .filterset import FilterSet
      File "E:py_virtualenvjoyoolibsite-packagesdjango_filtersfilterset.py", line 16, in <module>
        from .filters import (Filter, CharFilter, BooleanFilter, BaseInFilter, BaseRangeFilter,
      File "E:py_virtualenvjoyoolibsite-packagesdjango_filtersfilters.py", line 11, in <module>
        from django.db.models.sql.constants import QUERY_TERMS
    ImportError: cannot import name 'QUERY_TERMS'

    解决办法(solution)

    source code location:..Libsite-packagesdjango_filtersfilters.py

    try:
        from django.db.models.sql.constants import QUERY_TERMS
    except ImportError:
        # Django 2.1
        QUERY_TERMS = {
            'exact', 'iexact', 'contains', 'icontains', 'gt', 'gte', 'lt', 'lte', 'in',
            'startswith', 'istartswith', 'endswith', 'iendswith', 'range', 'year',
            'month', 'day', 'week_day', 'hour', 'minute', 'second', 'isnull', 'search',
            'regex', 'iregex',
        }

    错误十:

    python报错 ImportError: cannot import name ‘SKIP_ADMIN_LOG‘ from ‘import_export.admin‘

    运行python项目时报错:ImportError: cannot import name 'SKIP_ADMIN_LOG' from 'import_export.admin'

    如下:

    打开报错文件,发现直接红色提示了。

    分析步骤:

    1.打开 import_export/admin.py,搜索“SKIP_ADMIN_LOG”,发现确实没有SKIP_ADMIN_LOG 变量,只有一个方法 get_skip_admin_log(self) ,此方法返回了skip_admin_log,而这个方法是在ImportMixin 类中定义的。

    所以猜测,由于版本原因,旧版本中admin.py 是有SKIP_ADMIN_LOG的,新版本中放在了类中。而git上的项目用的是旧版包,我们拉取到本地之后下载的是新包,所以无法引用。

    2.此时修改报错文件的代码,引入需要的类,用类调用方法,以此获取变量:

    错误十一

    TypeError: argument of type ‘WindowsPath‘ is not iterable - in django python [duplicate]

    将setitng里的代码改一下:

    'NAME': BASE_DIR / 'db.sqlite3',

    改为

    'NAME': str(os.path.join(BASE_DIR, "db.sqlite3"))

    之后便是:

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': str(os.path.join(BASE_DIR, "db.sqlite3"))
        }
    }

    问题解决

    错误十二

    TypeError: login() got an unexpected keyword argument 'extra_context'暂时解决办法

    直接将xadmin/views/website.py下的原有的website.py文件替换为以下内容即可,新website.py如下:

    from __future__ import absolute_import
    from django.utils.translation import ugettext as _
    from django.contrib.auth import REDIRECT_FIELD_NAME
    from django.views.decorators.cache import never_cache
    from django.contrib.auth.views import LoginView as login    #与旧的不同
    from django.contrib.auth.views import LogoutView as logout  #与旧的不同
    from django.http import HttpResponse
    
    from .base import BaseAdminView, filter_hook
    from .dashboard import Dashboard
    from xadmin.forms import AdminAuthenticationForm
    from xadmin.models import UserSettings
    from xadmin.layout import FormHelper
    
    
    class IndexView(Dashboard):
        title = _("Main Dashboard")
        icon = "fa fa-dashboard"
    
        def get_page_id(self):
            return 'home'
    
    
    class UserSettingView(BaseAdminView):
    
        @never_cache
        def post(self, request):
            key = request.POST['key']
            val = request.POST['value']
            us, created = UserSettings.objects.get_or_create(
                user=self.user, key=key)
            us.value = val
            us.save()
            return HttpResponse('')
    
    
    class LoginView(BaseAdminView):
    
        title = _("Please Login")
        login_form = None
        login_template = None
    
        @filter_hook
        def update_params(self, defaults):
            pass
    
        @never_cache
        def get(self, request, *args, **kwargs):
            context = self.get_context()
            helper = FormHelper()
            helper.form_tag = False
            helper.include_media = False
            context.update({
                'title': self.title,
                'helper': helper,
                'app_path': request.get_full_path(),
                REDIRECT_FIELD_NAME: request.get_full_path(),
            })
            defaults = {
                'extra_context': context,
                # 'current_app': self.admin_site.name,
                'authentication_form': self.login_form or AdminAuthenticationForm,
                'template_name': self.login_template or 'xadmin/views/login.html',
            }
            self.update_params(defaults)
            # return login(request, **defaults)
            return login.as_view(**defaults)(request)   #与旧的不同
    
        @never_cache
        def post(self, request, *args, **kwargs):
            return self.get(request)
    
    
    class LogoutView(BaseAdminView):
    
        logout_template = None
        need_site_permission = False
    
        @filter_hook
        def update_params(self, defaults):
            pass
    
        @never_cache
        def get(self, request, *args, **kwargs):
            context = self.get_context()
            defaults = {
                'extra_context': context,
                # 'current_app': self.admin_site.name,
                'template_name': self.logout_template or 'xadmin/views/logged_out.html',
            }
            if self.logout_template is not None:
                defaults['template_name'] = self.logout_template
    
            self.update_params(defaults)
            # return logout(request, **defaults)
            return logout.as_view(**defaults)(request)    #与旧的不同
    
        @never_cache
        def post(self, request, *args, **kwargs):
            return self.get(request)
    

      

     错误十三

    [Python开发技巧]·解决Django render() got an unexpected keyword argument 'renderer'问题

    解决方法如下。

    我们启动项目,进入文章发布页面。提示出错:

    render() got an unexpected keyword argument 'renderer'

    3.jpg

    错误页面上有提示,出错的地方是下面文件的93行。

    F:coursemyblogmyblogvenvlibsite-packagesdjangoformsoundfield.py in as_widget, line 93

    我这里使用的是最新版本的Django2.1.1所以报错,解决办法很简单。打开这个文件的93行,注释这行即可。

    4.jpg

    修改成之后,重新刷新页面,就可以看到我们的富文本编辑器正常显示。

    错误十四

    记录 TypeError: render() got an unexpected keyword argument 'renderer' 错误

     

    在网上看到MXShop这个项目,适合Python, Django + drf 进阶的,其中遇到 TypeError: render() got an unexpected keyword argument 'renderer', 在百度一番后发现是Django集成DjangoUeditor,才导致这个错误的.网上有什么资料都是去改Django的源文件,但是我觉得这样很不好,因为部署到新环境的时候,都要手动去改一下Django源文件,这样太麻烦了

    所以打算在DjangoUeditor上找原因,最后居然成功找到了,挺高兴的,原因是 DjangoUeditor > widgets.py > UEditorWidget 类,间接继承 django > forms > widgets.py > Widget 类,而 django > forms > widgets.py > Widget 类

    def render(self, name, value, attrs=None, renderer=None): 

    这个方法,比之前版本多添加了这个参数 renderer=None

    但是,但是,但是!!!
    DjangoUeditor > widgets.py > UEditorWidget 类,重写这个方法 def render(self, name, value, attrs=None),这个 django 在不断更新,DjangoUeditor却没有更新,所以应该把
    def render(self, name, value, attrs=None)
    改成!!
    def render(self, name, value, attrs=None, renderer=None):
    
    
    如图所示!!!!!!!!!!!

    错误十五

    xadminwidgets.py in render, line 81

    解决方法:

    既然“
    ”不能拆分标签,那么就换一种拆分方式,使用“/><”拆分。
    
    原代码:
    
    input_html = [ht for ht in super(AdminSplitDateTime, self).render(name, value, attrs).split('
    ') if ht != '']
    
        1
    
    修改后代码:
    
    input_html = [ht for ht in super(AdminSplitDateTime, self).render(name, value, attrs).split('/><') if ht != '']
    input_html[0] = input_html[0] + "/>"
    input_html[1] = "<" + input_html[1]
    

    错误十六

    问题原因

    报错代码的目录
    venvlibsite-packagesxadminwidgets.py in render, line 80

    具体代码
    <div class="datetime clearfix">
    上面贴出来的最后一行代码就是widgets.py的第80行代码。

    问题解决

    源代码:
    input_html = [ht for ht in super(AdminSplitDateTime, self).render(name, value, attrs).split('
    ') if ht != '']
    修改后的代码:
     

    input_html = [ht for ht in super(AdminSplitDateTime, self).render(name, value, attrs).split('/><') if ht != '']

    input_html[0] = input_html[0] + "/>"

    input_html[1] = "<" + input_html[1]

    这只是其中一种方法,如果不能解决问题 请打开以下链接地址

    此文转载于http://blog.csdn.net/yuhan963/article/details/79167743

    错误十七

    源代码:

    input_html = [ht for ht in super(AdminSplitDateTime, self).render(name, value, attrs).split('/><') if ht != '']

    所在函数换成如下内容:

        def render(self, name, value, attrs=None,renderer=None):
            input_html = [ht for ht in super(AdminSplitDateTime, self).render(name, value, attrs).split('/><') if ht != '']
            zhanwei_one = ""
            zhanwei_two = ""
            if (len(input_html) > 1):
                zhanwei_one = input_html[0] + "/>"
                zhanwei_two = "<" + input_html[1]
    
            # return input_html
            return mark_safe('<div class="datetime clearfix"><div class="input-group date bootstrap-datepicker"><span class="input-group-addon"><i class="fa fa-calendar"></i></span>%s'
                             '<span class="input-group-btn"><button class="btn btn-default" type="button">%s</button></span></div>'
                             '<div class="input-group time bootstrap-clockpicker"><span class="input-group-addon"><i class="fa fa-clock-o">'
                             '</i></span>%s<span class="input-group-btn"><button class="btn btn-default" type="button">%s</button></span></div></div>' % (zhanwei_one, _(u'Today'), zhanwei_two, _(u'Now')))

    错误十八

    get_deleted_objects() takes 3 positional arguments but 5 were given

    django 的 xadmin 报错 get_deleted_objects() takes 3 positional arguments but 5 were given

     (self.deleted_objects, model_count, self.perms_needed, self.protected) = get_deleted_objects(
                [self.obj], self.opts, self.request.user, self.admin_site, using)
    
    • 1
    • 2
    • 改成
          (self.deleted_objects, model_count, self.perms_needed, self.protected) = get_deleted_objects(
                [self.obj], self.request.user, self.admin_site)

    错误十九

    xadmin+django2.0删除用户报错,get_deleted_objects() takes 3 positional arguments but 5 were given

     

    解决方法:将xadmin/plugins/actions.py中的

    复制代码
            if django_version > (2, 0):
                #deletable_objects, model_count, perms_needed, protected = get_deleted_objects(
                   # queryset, self.opts, self.admin_site)
                using = router.db_for_write(self.model)
                deletable_objects, model_count, perms_needed, protected = get_deleted_objects(
                     queryset, self.opts, self.user, self.admin_site, using)
            else:
                using = router.db_for_write(self.model)
                deletable_objects, model_count, perms_needed, protected = get_deleted_objects(
                    queryset, self.opts, self.user, self.admin_site, using)
    复制代码

    改为

    复制代码
            if django_version > (2, 1):
                deletable_objects, model_count, perms_needed, protected = get_deleted_objects(
                    queryset, self.opts, self.admin_site)
                # using = router.db_for_write(self.model)
                # deletable_objects, model_count, perms_needed, protected = get_deleted_objects(
                #     queryset, self.opts, self.user, self.admin_site, using)
            else:
                using = router.db_for_write(self.model)
                deletable_objects, model_count, perms_needed, protected = get_deleted_objects(
                    queryset, self.opts, self.user, self.admin_site, using)
    复制代码

    错误二十

    django报错:django.core.exceptions.ImproperlyConfigured: 处理办法

    django报错:

    Eclipse pydev 运行不出错,cmd 命令行界面中python 运行出错:

    django.core.exceptions.ImproperlyConfigured: 

    Requested setting DATABASES, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call

     settings.configure() before accessing settings.

    解决方法一:

    Main代码中增加;

    import os

    os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'

    解决方法二:

    命令行运行程序之前运行以下命令或者在bat 批处理文件中增加这句话;

    set DJANGO_SETTINGS_MODULE=mysite.settings

     错误二十一

  • 相关阅读:
    1.两数之和
    [Udemy] ES 7 and Elastic Stack
    [Udemy] ES 7 and Elastic Stack
    Common Linux Commands 日常工作常用Linux命令
    ELK 学习
    web 3d 技术预研及数据可视化技术
    AWS Cloud Practioner 官方课程笔记
    怎么用 pytorch 查看 GPU 信息
    ECG 项目预研
    怎么查看keras 或者 tensorflow 正在使用的GPU
  • 原文地址:https://www.cnblogs.com/jingzaixin/p/14352160.html
Copyright © 2020-2023  润新知