Django Admin如何仅分组部分字段而无需指定全部字段?
解决Django Admin部分字段单独分组、其余字段自动包含的问题
你可以通过动态获取模型字段的方式实现需求,不用手动罗列所有字段,新增字段时也会自动加入默认分组:
方法一:使用get_fieldsets动态生成分组(推荐)
重写Admin类的get_fieldsets方法,动态过滤出除特殊字段外的所有字段,每次请求都会实时获取最新的模型字段配置:
@admin.register(MyModel) class MyModelAdmin(admin.ModelAdmin): # 指定要单独分组的字段 _special_fields = ("field_11", "field_12") def get_fieldsets(self, request, obj=None): # 获取模型所有字段名,排除特殊字段 default_fields = [ field.name for field in MyModel._meta.fields if field.name not in self._special_fields ] # 返回最终分组配置 return ( (None, {"fields": default_fields}), ("My special section", {"fields": self._special_fields}), )
这种方式的优势是实时生效,给模型新增字段后,无需重启服务或修改Admin配置,新字段会自动出现在默认分组中。
方法二:类加载时静态计算字段
如果你的模型字段不会频繁变动,也可以在Admin类定义时直接计算默认字段列表:
@admin.register(MyModel) class MyModelAdmin(admin.ModelAdmin): _special_fields = ("field_11", "field_12") # 静态计算默认字段列表 _default_fields = [ f.name for f in MyModel._meta.fields if f.name not in _special_fields ] fieldsets = ( (None, {"fields": _default_fields}), ("My special section", {"fields": _special_fields}), )
注意这种方式是在Admin类加载时计算字段列表,新增字段后需要重启服务才会生效,适合字段结构稳定的场景。
注意事项
- 不要同时设置
fields属性,否则会覆盖fieldsets的配置逻辑。 - 如果有
readonly_fields,默认情况下Django会自动将其加入字段列表;但如果手动指定了fields,需要显式将这些只读字段添加到对应分组中。
内容的提问来源于stack exchange,提问作者Kevin Renskers
相关产品推荐
相关产品推荐

