转载Django3.0.2和XAdmin遇到的Bug
报异常 ‘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:...)
回到顶部
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(‘
‘
‘
‘%s
复制代码
上面贴出来的最后一行代码就是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,又遇到后续会补充

浙公网安备 33010602011771号