1、list_filter设置外键字段时,显示bug
在list_filter中加入department__name(外键名__字段名)
class InterviewAdmin(object):
...
list_filter = ('status', 'department__name', 'final_result')
...
会在过滤器中出现如下显示bug(同时显示字段名和字段的verbose_name值):
解决办法:
在xadmin/plugins/filters.py中注释掉125、127行
这样显示就正常了
还有个很严重的问题:
这个verbose_name值是所关联表的verbose_name值,但是我们想要显示的是当前表的verbose_name值。也就是应该显示面试部门而非部门名称。
解决办法:
xadmin\filters.py中注释掉114行,新加115、116、117行
2、style_fields设置多对多字段显示样式bug
当在style_fields中设置字段为m2m_transfer样式时,提交表单会提示如下信息(正产情况下不需要选择的,可参考django的权限管理):
解决办法:
问题应该出现在前端的js上,\xadmin\static\xadmin\js\xadmin.widget.select-transfer.js就是这个文件,有前端大神的话可以研究一下,我现在是没精力搞这个了。。。
另一个思路就是自己带写一段js代码,在表单提交时将已选项默认选中一项。
3、无法加载主题切换功能
开启主题切换功能,只需做如下设置,此种设置仅有两种默认的bootstrap主题:
如果想获取更多主题,需要添加如下配置:
然而,大概率会报如下错误:
HTTPSConnectionPool(host='bootswatch.com', port=443): Max retries exceeded with url: /api/3.json (Caused by NewConnectionError('<urllib3.connection.VerifiedHTTPSConnection object at 0x000002079F1C1668>: Failed to establish a new connection: [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。',))
博主通过阅读xadmin/plugins/themes.py源码进行错误排查,基本锁定错误发生在第75行。在访问bootswatch资源时超时。每次服务重启,第一次进入系统都要等1~2分钟也是因为这里的问题。
解决办法:
浏览器访问https://bootswatch.com/api/3.json查看所有可用主题。将可用主题的name,css参数记录到user_themes参数中即可。
最终效果:
4、readonly_fields不能包含models.BinaryField类型字段
readonly_fields不能包含models.BinaryField类型字段,否则可能会报编码错误。django本身就默认BinaryField在admin详情页为只读、隐藏、不可编辑的字段。
5、详情页保存之后,会直接跳转到列表页,所有的过滤器失效
修改xadmin/views/edit.py/UpdateAdminView/post_response()函数,将列表转为元祖:tuple(self.request.session['LIST_QUERY'][0])
@filter_hook
def post_response(self):
"""
Determines the HttpResponse for the change_view stage.
"""
opts = self.new_obj._meta
obj = self.new_obj
request = self.request
verbose_name = opts.verbose_name
pk_value = obj._get_pk_val()
msg = _('The %(name)s "%(obj)s" was changed successfully.') % {'name':
force_text(verbose_name), 'obj': force_text(obj)}
if "_continue" in request.POST:
self.message_user(
msg + ' ' + _("You may edit it again below."), 'success')
return request.path
elif "_addanother" in request.POST:
self.message_user(msg + ' ' + (_("You may add another %s below.")
% force_text(verbose_name)), 'success')
return self.model_admin_url('add')
else:
self.message_user(msg, 'success')
# Figure out where to redirect. If the user has change permission,
# redirect to the change-list page for this object. Otherwise,
# redirect to the admin index.
if "_redirect" in request.POST:
return request.POST["_redirect"]
elif self.has_view_permission():
change_list_url = self.model_admin_url('changelist')
# 将列表转为元祖
if 'LIST_QUERY' in self.request.session \
and tuple(self.request.session['LIST_QUERY'][0]) == self.model_info:
change_list_url += '?' + self.request.session['LIST_QUERY'][1]
return change_list_url
else:
return self.get_admin_url('index')