xadmin 怎么禁止不在list_display中的字段显示?
如图,我在list_display中设置只有三个字段可显示,但是在后台即使是普通用户也可以通过右上角的显示列,来自定义别的不在列表中的字段显示,用来测试的不是超级管理员,...
如图,我在list_display中设置只有三个字段可显示,但是在后台即使是普通用户也可以通过右上角的显示列,来自定义别的不在列表中的字段显示,用来测试的不是超级管理员,而是只有查看权限的普通用户。
展开
1个回答
展开全部
楼主你这个问题我倒是知道:
list页面比较好解决,使用list_exclude即可,会隐藏显示列中的相应内容。
如list_exclude=['tel','money'],这两列都不会在显示列中出现,当然如果list_dispaly中有,还是会显示出值来,如果要简单达到只要出现在list_exclude中,无论显示列还是列表都不显示,修改下源码list.py588行:
row.cells = [self.result_item(
obj, field_name, row) for field_name in self.list_display]
改成:
row.cells = [self.result_item(
obj, field_name, row) for field_name in self.list_display if field_name not in self.list_exclude] 即可。
然而这样并不能达到隐藏信息的效果,因为详情页、修改页还是可以看到相应信息:exclude可以隐藏添加和修改页面的信息,然而详情页面不知道为什么不能。。。尝试看了源码,detail发送给模版的form已经完成了过滤,form中是没有相关字段的,然而使用{% crispy form %}渲染时又给加上了,怀疑是helper的问题,但看了源码也不知道到底哪里加上的。。。
尝试了一下,form_layout决定是否在各个页面显示,决定修改下源码,在detail的get_form_layout之前修改form_layout元祖的内容,把list_exclude中的数据全删掉,这样就能实现只配置一个list_exclude就各个页面都不显示指定字段了(增加和修改页面除外)
——————8.21补充————
最近对xadmin源码研究比较深入了,特意来补充下:
楼主的要求应该是某一类权限用户隐藏部分信息:
xadmin信息显示会在:list、update、detail三个页面都显示出来。这其中,list_display控制list显示,但用户可以在显示列中点击显示,使用list_exclude可以让显示列中也不显示该项目。每次勤快一点,确定要隐藏的字段不在display中,list_excelude中也有,那么也不必修改源码。
update页面也比较简单,要隐藏的信息通过exclude设置,需要注意的是也不同出现在readonly_fields中,不然仍然会在“其他字段”中提醒显示出来。另外还有一点,exclude同时也控制add页面的显示,增加时肯定是必须所有字段全部填写的,所以最好重写get_model_form方法,if "update" in self.request.path:self.exclude=[...]
detail页面就复杂了,首先如果你不设置layout,那么exclude也完全可以控制,但如果设置了layout,出现在layout中的字段会在get_form_helper方法中通过replace_field_to_value被转化为showfield,即使它在modelform表单中已经被过滤了!所以如果想要在detail页面也隐藏,要么不要设置layout,要么就只能修改下replace_field_to_value方法,在方法中添加一道exclude的过滤了。
考虑到自定义布局几乎是必须的,还是建议修改源码,其实也很简单,如果字段在exclude中,就不要替换成showfield,反而要删除它即可,这样一来,就可以通过合理地修改exclude的值,同时在update、detail、add三个页面隐藏信息了。
list页面比较好解决,使用list_exclude即可,会隐藏显示列中的相应内容。
如list_exclude=['tel','money'],这两列都不会在显示列中出现,当然如果list_dispaly中有,还是会显示出值来,如果要简单达到只要出现在list_exclude中,无论显示列还是列表都不显示,修改下源码list.py588行:
row.cells = [self.result_item(
obj, field_name, row) for field_name in self.list_display]
改成:
row.cells = [self.result_item(
obj, field_name, row) for field_name in self.list_display if field_name not in self.list_exclude] 即可。
然而这样并不能达到隐藏信息的效果,因为详情页、修改页还是可以看到相应信息:exclude可以隐藏添加和修改页面的信息,然而详情页面不知道为什么不能。。。尝试看了源码,detail发送给模版的form已经完成了过滤,form中是没有相关字段的,然而使用{% crispy form %}渲染时又给加上了,怀疑是helper的问题,但看了源码也不知道到底哪里加上的。。。
尝试了一下,form_layout决定是否在各个页面显示,决定修改下源码,在detail的get_form_layout之前修改form_layout元祖的内容,把list_exclude中的数据全删掉,这样就能实现只配置一个list_exclude就各个页面都不显示指定字段了(增加和修改页面除外)
——————8.21补充————
最近对xadmin源码研究比较深入了,特意来补充下:
楼主的要求应该是某一类权限用户隐藏部分信息:
xadmin信息显示会在:list、update、detail三个页面都显示出来。这其中,list_display控制list显示,但用户可以在显示列中点击显示,使用list_exclude可以让显示列中也不显示该项目。每次勤快一点,确定要隐藏的字段不在display中,list_excelude中也有,那么也不必修改源码。
update页面也比较简单,要隐藏的信息通过exclude设置,需要注意的是也不同出现在readonly_fields中,不然仍然会在“其他字段”中提醒显示出来。另外还有一点,exclude同时也控制add页面的显示,增加时肯定是必须所有字段全部填写的,所以最好重写get_model_form方法,if "update" in self.request.path:self.exclude=[...]
detail页面就复杂了,首先如果你不设置layout,那么exclude也完全可以控制,但如果设置了layout,出现在layout中的字段会在get_form_helper方法中通过replace_field_to_value被转化为showfield,即使它在modelform表单中已经被过滤了!所以如果想要在detail页面也隐藏,要么不要设置layout,要么就只能修改下replace_field_to_value方法,在方法中添加一道exclude的过滤了。
考虑到自定义布局几乎是必须的,还是建议修改源码,其实也很简单,如果字段在exclude中,就不要替换成showfield,反而要删除它即可,这样一来,就可以通过合理地修改exclude的值,同时在update、detail、add三个页面隐藏信息了。
大雅新科技有限公司
2024-11-19 广告
2024-11-19 广告
这方面更多更全面的信息其实可以找下大雅新。深圳市大雅新科技有限公司从事KVM延长器,DVI延长器,USB延长器,键盘鼠标延长器,双绞线视频传输器,VGA视频双绞线传输器,VGA延长器,VGA视频延长器,DVI KVM 切换器等,优质供应商,...
点击进入详情页
本回答由大雅新科技有限公司提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询