Django 由 admin 转 xadmin 填坑

本文档详细记录了在使用Django2.2.1和Xadmin进行项目开发时遇到的常见问题及解决方法,包括IndexError、ImportError、AttributeError等错误的修复方案,涉及代码修改、包导入调整等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

环境:

1、python 3.7.0

2、django 2.2.1

问题1:IndexError at /xadmin/db_model/user/10019678227105/update/

     list index out of range

解决办法:

       1、修改 /xadmin/widgets.py 文件,修改 render() 方法的返回值。注释第 78 - 81 行,并添加新的返回。

 def render(self, name, value, attrs=None):
        if DJANGO_11:
            input_html = [ht for ht in super(AdminSplitDateTime, self).render(name, value, attrs).replace(
                '/><input', '/>\n<input').split('\n') if ht != '']
            # 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>' % (input_html[0], _(u'Today'), input_html[1], _(u'Now')))
            return input_html[0]     # 添加新的返回
        else:
            return super(AdminSplitDateTime, self).render(name, value, attrs)

问题2:ImportError: cannot import name 'javascript_catalog' from 'django.views.i18n'

解决方法:

       1、修改 settings.py 文件中 INSTALLED_APPS 项,添加 django.conf。

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    # 集成 xadmin
    'xadmin',
    'crispy_forms',
    'reversion',
    'django.conf',  # 添加

    'db_model',
    'rest_framework',
    'api',
]

       2、修改 /xadmin/sites.py 文件,注释第 355 - 358 行,并导入 JavaScriptCatalog 类,修改返回。

def i18n_javascript(self, request):
    """
        Displays the i18n JavaScript that the Django admin requires.

        This takes into account the USE_I18N setting. If it's set to False, the
        generated JavaScript will be leaner and faster.
    """
    # if settings.USE_I18N:
    #     from django.views.i18n import javascript_catalog
    # else:
    #     from django.views.i18n import null_javascript_catalog as javascript_catalog
    from django.views.i18n import JavaScriptCatalog
    return JavaScriptCatalog().get(request=request, **{'packages': 'django.conf+xadmin'})

  

问题3:AttributeError at /xadmin/db_model/user/10019678227105/update/ 

       'XxxxField' object has no attribute 'rel'

解决办法:

         1、将错误对应地方的 rel 字段改成 remote_field,例如:

# if isinstance(f.rel, models.ManyToOneRel):
if isinstance(f.remote_field, models.ManyToOneRel):

问题4:ModuleNotFoundError: No module named 'django.core.urlresolvers'

解决方法:修改所有引入 django.core.urlresolvers 包的文件,修改如下:

#from django.core.urlresolvers import reverse
from django.urls import reverse

注意:引用 NoReverseMatch 类的地方也要修改,如:

#from django.core.urlresolvers import NoReverseMatch
from django.urls import NoReverseMatch

问题5:TypeError: __init__() missing 1 required positional argument: 'on_delete'

解决方法:修改 models.py 里面所有报错的地方,添加 on_delete=CASCADE,并导入相应的包:from django.db.models import CASCADE,如:

# user = models.ForeignKey(AUTH_USER_MODEL, verbose_name=_(u"user"), blank=True, null=True)
# 添加 on_delete=CASCADE
user = models.ForeignKey(AUTH_USER_MODEL, verbose_name=_(u"user"), blank=True, null=True,on_delete=CASCADE)

问题6:TypeError: __init__() takes 1 positional argument but 6 were given

解决方法:打开报错文件 \xadmin\views\dashboard.py 第 284 - 285 行,修改如下:

 # forms.Field.__init__(self, required, widget, label, initial, help_text,
        #                      *args, **kwargs)
 forms.Field.__init__(self)

 

问题7:ImportError: cannot import name 'login' from 'django.contrib.auth.views' 

解决方法:修改报错位置导入的包,修改如下:

# from django.contrib.auth.views import login
# from django.contrib.auth.views import logout
from django.contrib.auth import login,logout

 

问题8: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

 

问题9:ImportError: cannot import name 'password_reset_confirm' from 'django.contrib.auth.views' 

解决方法:修改报错文件 \xadmin\plugins\passwords.py 导入的包,修改如下:

# from django.contrib.auth.views import password_reset_confirm
from django.contrib.auth.views import PasswordResetConfirmView

然后修改用到的位置 第 78 - 83 行,修改如下:

def do_view(self, request, uidb36, token, *args, **kwargs):
        context = super(ResetPasswordComfirmView, self).get_context()
        # return password_reset_confirm(request, uidb36, token,
        #            template_name=self.password_reset_confirm_template,
        #            token_generator=self.password_reset_token_generator,
        #            set_password_form=self.password_reset_set_form,
        #            post_reset_redirect=self.get_admin_url('xadmin_password_reset_complete'),
        #            current_app=self.admin_site.name, extra_context=context)
        return PasswordResetConfirmView(request, uidb36, token,
                   template_name=self.password_reset_confirm_template,
                   token_generator=self.password_reset_token_generator,
                   set_password_form=self.password_reset_set_form,
                   post_reset_redirect=self.get_admin_url('xadmin_password_reset_complete'),
                   current_app=self.admin_site.name, extra_context=context)

问题10:AttributeError: 'Settings' object has no attribute 'MIDDLEWARE_CLASSES'

解决方法:修改 admin\plugins\language.py 第 24 行,修改如下:

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值