Django2.0.2和XAdmin遇到的Bug

转自:https://blog.csdn.net/jehon/article/details/84851611    和   https://blog.csdn.net/qq_34619992/article/details/79809432

报异常 ‘DateTimeField‘ object has no attribute ‘rel‘

修改 xadmin\views/list.py 中228行

if isinstance(field.rel, models.ManyToOneRel):

related_fields.append(field_name)

修改为

if isinstance(field.remote_field, models.ManyToOneRel):

related_fields.append(field_name)

ps:凡是报异常rel的地方都可以尝试将报错方法中的.rel 修改为.remote_field

手动添加系统日志时报异常: '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,

报异常:Exception: Relate Lookup field must a related field

修改 xadmin\util.py 中 495行

return (hasattr(field, 'rel') and field.rel != None) or is_related_field(field)

修改为

return (hasattr(field, 'remote_field') and field.remote_field != None) or is_related_field(field)

登录或注销时报异常:logout() got an unexpected keyword argument 'current_app' 或 login() got an unexpected keyword argument 'current_app'

修改xadmin\views\website.py 中61、87行

注释掉:# 'current_app': self.admin_site.name,

国际化问题报异常:ImportError: cannot import name 'javascript_catalog' from 'django.views.i18n' 

此异常会导致 adminx.py中的show_detail_fields 设置无效

由于django2.x中该javascript_catalog方法不存在,引起详情界面(xadmin.plugin.details.js)的JS代码执行异常,以下gettext()方法无法执行

方法1:临时解决办法(此方法按钮显示为英文),修改xadmin\sites.py中348行,注释掉

#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 null_javascript_catalog as javascript_catalog

方法2:同样注释掉上面的代码(同方法1,此方法按钮仍显示为英文)

添加行

from django.views.i18n import JavaScriptCatalog

return JavaScriptCatalog.as_view(packages=['django.conf'])(request)

方法3:不修改xadmin\sites.py,只修改django\views\i18n.py(此方法按钮显示为中文)。

先在settings.py -- INSTALLED_APPS=[...] 中添加 'django.conf'(否则会报异常Invalid package(s) provided to JavaScriptCatalog:...) 

再去git上找django1.9.x分支(https://github.com/django/django/blob/stable/1.9.x/django/views/i18n.py),将django\views\i18n.py文件中的代码复制到本地项目django2.X(记得保留JavaScriptCatalog这个类)的同名文件中。具体操作先从复制javascript_catalog这个方法开始,然后根据错误提示一步步补全剩余的代码,直到没有报错为止,这样就完美解决了显示中文问题。

django2.0把from django.core.urlresolvers修改成了django.urls

报错信息:

ModuleNotFoundError: No module named 'django.core.urlresolvers'

解决方法:

from django.urls import NoReverseMatch, reverse

django2.0中需要给外键ForeignKey指定on_delete参数

报错信息:

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

解决方法:

content_type = models.ForeignKey(ContentType,on_delete=models.CASCADE)

django2.0 forms表单初始化只需要一个参数  

报错信息:

forms.Field.__init__(self, required, widget, label, initial, help_text, *args, **kwargs)
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)

导入QUERY_TERMS报错(ImportError: cannot import name 'QUERY_TERMS')

解决方法:

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

Settings缺少MIDDLEWARE_CLASSES属性,django2.0把MIDDLEWARE_ClASSES改成MIDDLEWARE

报错信息:

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:

datetimefield报错问题

xadmin/widgets中第80行

 def render(self, name, value, attrs=None):
        input_html = [ht for ht in super(AdminSplitDateTime, self).render(name, value, attrs).split(‘\n‘) if ht != ‘‘]
        # 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>‘ % (input_html[0], _(u‘Today‘), input_html[1], _(u‘Now‘)))

上面贴出来的最后一行代码就是widgets.py的第80行代码。

可以看出这句代码是希望用“\n”把input_html里的两个标签拆开,但两个标签之间没有换行,所以没能拆分,导致报错。

input_html[1]就是报错的代码,因为input_html里只有一个元素。

 解决办法:

既然“\n”不能拆分标签,那么就换一种拆分方式,使用“/><”拆分。

input_html = [ht for ht in super(AdminSplitDateTime, self).render(name, value, attrs).split(‘\n‘) 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]

ok,又遇到后续会补充

 

posted @ 2019-07-30 21:16  blog_wu  阅读(1102)  评论(0)    收藏  举报