Python中django-admin是否有可以实现‘可勾选显示和隐藏字段’的轮子?
这里先给各位大佬问好。
- 在使用
django做一个内部系统项目的过程中遇到一个需求: 由于模型的字段太多,在admin -> 模型 -> 列表界面想要实现一个可勾选显示和隐藏字段的功能。 django -> admin -> list_display是一次性规定好了要显示哪些字段,但是某些字段太多有的内容也比较长,使用方想自己灵活控制。- 目前功能已经实现,是在
admin增加额外页面自己写template显示的,但是无奈代码太肥,同时也想要能够复用给所有模型。 - 这里想问问有没有大佬知道有相关的轮子或者库可以用的,让代码更加华丽,谢谢各位
Python中django-admin是否有可以实现‘可勾选显示和隐藏字段’的轮子?
3 回复
有现成的轮子,直接上代码。
方案一:使用 django-admin-view-permissions
这个包专门做这个,安装后简单配置就行。
pip install django-admin-view-permissions
# settings.py
INSTALLED_APPS = [
'admin_view_permissions',
# ...其他app
]
# admin.py
from django.contrib import admin
from admin_view_permissions.admin import FieldPermissionsAdminMixin
@admin.register(YourModel)
class YourModelAdmin(FieldPermissionsAdminMixin, admin.ModelAdmin):
# 1. 指定哪些字段可以被控制显示/隐藏
field_permissions = ['field1', 'field2', 'field3']
# 2. 可选:设置默认显示的字段
def get_fields(self, request, obj=None):
fields = super().get_fields(request, obj)
# 这里可以根据用户权限过滤字段
return fields
然后在Admin后台的用户/组权限设置里,会多出控制字段显示的权限项。
方案二:自己撸一个(如果需求简单)
# admin.py
from django.contrib import admin
from django.contrib.auth.models import User
class CustomModelAdmin(admin.ModelAdmin):
# 定义所有可能的字段
all_fields = ['id', 'name', 'email', 'created_at', 'is_active']
def get_fields(self, request, obj=None):
# 这里可以根据用户或组来动态返回字段
# 示例:根据用户组决定显示哪些字段
if request.user.groups.filter(name='高级用户').exists():
return self.all_fields
else:
return ['id', 'name', 'email'] # 基础用户只显示这些
# 如果需要更细粒度控制,可以重写get_fieldsets
def get_fieldsets(self, request, obj=None):
fieldsets = super().get_fieldsets(request, obj)
# 动态修改fieldsets
return fieldsets
@admin.register(YourModel)
class YourModelAdmin(CustomModelAdmin):
pass
总结:直接用 django-admin-view-permissions 最省事。
建议你单独写个 JS 来完成这个功能吧
django admin 比较适合工程师开发的过程中用来填一些数据,快速完成并验证模型,可定制化不强,不太适合作为产品的管理后台来使用,还是得根据具体业务需求单独做一个管理后台靠谱的多。
相比 ROR 的 active admin 来说,django admin 还是太弱,我做自己的业余项目已经不考虑 django 了
感谢你的提示,确实可以直接写 js+API 来控制。目前这个内部系统已经比较完善,主要还是使用方在提需求以便提高他们效率。在项目过程中确实遇到了很多 django 限制,改来改去代码越来越庞大,估计以后会越来越乱。。

