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,又遇到后续会补充