Python中django-admin是否有可以实现‘可勾选显示和隐藏字段’的轮子?

这里先给各位大佬问好。

  1. 在使用django做一个内部系统项目的过程中遇到一个需求: 由于模型的字段太多,在admin -> 模型 -> 列表界面想要实现一个可勾选显示和隐藏字段的功能。
  2. django -> admin -> list_display是一次性规定好了要显示哪些字段,但是某些字段太多有的内容也比较长,使用方想自己灵活控制。
  3. 目前功能已经实现,是在admin增加额外页面自己写template显示的,但是无奈代码太肥,同时也想要能够复用给所有模型。
  4. 这里想问问有没有大佬知道有相关的轮子或者库可以用的,让代码更加华丽,谢谢各位

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 限制,改来改去代码越来越庞大,估计以后会越来越乱。。

回到顶部