Django 3.x 版本使用xadmin问题汇总

一、引入报错:ImportError: cannot import name 'six' from 'django.utils'

解决办法:

在python3.x/site-packages中找到six.py文件,
将six.py文件复制到django/utils目录下

# 将site-packages/haystack/inputs.py 中
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

二、找不到模块:No module named 'django.core.urlresolvers'

因为Django 3.x 已经把django.core.urlresolvers模块的内容迁移至django.urls中,所以django.core.urlresolvers模块中的所有内容均可在django.urls中找到。

解决办法:

from django.core.urlresolvers import reverse
#替换成:
from django.urls import reverse

三、找不到模块:No module named 'django.contrib.staticfiles.templatetags'

解决办法:

from django.contrib.staticfiles.templatetags.staticfiles import static
# 替换成:
from django.templatetags.static import static

四、Django \xadmin\views\dashboard.py报错TypeError: init() takes 1 positional argument but 6 were given

解决办法:

forms.Field.init(self, required, widget, label, initial, help_text, *args, **kwargs)
#替换成:
forms.Field.init(self)

五、引入报错:ImportError: cannot import name 'login' from 'django.contrib.auth.views'

django已将login类和logout类改为LoginView和LogoutView

解决办法:

from django.contrib.auth.views import login#logout
#替换为:
from django.contrib.auth.views import LoginView#LogoutView

六、引入报错:ImportError: cannot import name 'QUERY_TERMS' from 'django.db.models.sql.query'

解决办法:

from django.db.models.sql.query import LOOKUP_SEP, QUERY_TERMS
#替换成:
from django.db.models.sql.query import LOOKUP_SEP, Query

#同时,filter.py 文件中第47行
if len(parts) > 1 and parts[-1] in QUERY_TERMS:
#替换成:
if len(parts) > 1 and parts[-1] in Query:

七、ModuleNotFoundError: No module named 'django.contrib.formtools'

解决办法:

# 卸载旧版本
pip uninstall django-formtools
# 安装新版本
pip install django-formtools

八、cannot import name 'password_reset_confirm' from 'django.contrib.auth.views'

解决办法:

from django.contrib.auth.views import password_reset_confirm
#替换成:
from django.contrib.auth.views import PasswordResetConfirmView

#第77行中
return password_reset_confirm(...)
#替换成:
return PasswordResetConfirmView(...)

九、AttributeError:'Settings' object has no attribute 'MIDDLEWARE_CLASSES'

解决办法:

if settings.LANGUAGES and 'django.middleware.locale.LocaleMiddleware' in settings.MIDDLEWARE_CLASSES:
#替换成: 
if settings.LANGUAGES and 'django.middleware.locale.LocaleMiddleware' in settings.MIDDLEWARE:

十、runserver时抛错:'Media' object has no attribute 'add_js'

解决办法:

# 将xadmin的util.py文件下
def vendor(*tags):
    media = Media()
    for tag in tags:
        file_type = tag.split('.')[-1]
        files = xstatic(tag)
        if file_type == 'js':
            media.add_js(files)
        elif file_type == 'css':
            media.add_css({'screen': files})
    return media
# 替换成:
def vendor(*tags):
    css = {'screen': []}
    js = []
    for tag in tags:
        file_type = tag.split('.')[-1]
        files = xstatic(tag)
        if file_type == 'js':
            js.extend(files)
        elif file_type == 'css':
            css['screen'] += files
    return Media(css=css, js=js)

十一、runserver时抛错:'DateTimeField' object has no attribute 'rel'

解决办法:

# \xadmin\views\list.py中228行
if isinstance(field.rel, models.ManyToOneRel):
# 替换成:
if isinstance(field.remote_field, models.ManyToOneRel):
# 其他有关.rel的报错,都从相应的.py文件中进行修改

十二、点击主页“添加小组件”报错:render() got an unexpected keyword argument 'renderer'

Django 3.x 版本使用xadmin问题汇总_第1张图片

解决办法:

错误发生在Python\Python38\Lib\site-packages\django\forms\boundfield.py 中as_widget函数(第79行)

def as_widget(self, widget=None, attrs=None, only_initial=False):
        """
        Render the field by rendering the passed widget, adding any HTML
        attributes passed as attrs. If a widget isn't specified, use the
        field's default widget.
        """
        widget = widget or self.field.widget
        if self.field.localize:
            widget.is_localized = True
        attrs = attrs or {}
        attrs = self.build_widget_attrs(attrs, widget)
        if self.auto_id and 'id' not in widget.attrs:
            attrs.setdefault('id', self.html_initial_id if only_initial else self.auto_id)
        return widget.render(
            name=self.html_initial_name if only_initial else self.html_name,
            value=self.value(),
            attrs=attrs,
            renderer=self.form.renderer, 
        )

但实际引起错误的文件是 xadmin\views\dashboard.py WidgetTypeSelect类中render函数第36行


def render(self, name, value, attrs=None): 
# 替换成:
def render(self, name, value, attrs=None, renderer=None):

 不过后期还会出问题,所以修改代码后,同时也将上述代码中的renderer=self.form.renderer, 注释掉

十三、手动填加日志报错:'ManyToOneRel' object has no attribute 'to'

解决办法:\xadmin\plugins\quickform.py中第80行

self.add_url, (_('Create New %s') % self.rel.to._meta.verbose_name), name
# 替换成:
self.add_url, (_('Create New %s') % self.rel), name

十四、修改models时报错:list index out of range

解决办法:

报错指向xadmin\widgets.py in render, line 80

def render(self, name, value, attrs=None):
    if DJANGO_11:
        input_html = [ht for ht in super(AdminSplitDateTime, self).render(name, value, attrs).split('\n') if ht != '']
# 替换成:
def render(self, name, value, attrs=None):
    if DJANGO_11:
        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]

十五、删除用户时报错:get_deleted_objects() takes 3 positional arguments but 5 were given

解决办法:xadmin\views\delete.py中第35行

[self.obj], self.opts, self.request.user, self.admin_site, using
# 替换成:
[self.obj], self.request.user, self.admin_site # 删除self.opts和using

 

你可能感兴趣的:(xadmin,django,后端)