如何让Django BaseAdmin通用化?适配无指定字段的模型
解决方案
要实现BaseAdmin的通用化,仅将模型中实际存在的字段设为只读字段,核心思路是在get_readonly_fields方法中动态过滤基础只读字段列表,只保留当前模型已定义的字段。
修改后的代码如下:
class BaseAdmin(admin.ModelAdmin): base_readonly_fields = ('created', 'updated','removed') def get_readonly_fields(self, request, obj=None): # 过滤出当前模型中存在的基础只读字段 valid_base_fields = [ field for field in self.base_readonly_fields if hasattr(self.model, field) ] # 合并子类自定义只读字段与有效基础字段 if self.readonly_fields: return tuple(self.readonly_fields) + tuple(valid_base_fields) else: return tuple(valid_base_fields) @admin.register(models.Example) class Example(BaseAdmin): list_display = ['id', 'name', 'sf_id', ]
关键说明:
- 通过
hasattr(self.model, field)检查当前模型是否包含目标字段,彻底避免因字段不存在引发的报错。 - 保留子类自定义
readonly_fields的逻辑,将其与过滤后的有效基础字段合并,不破坏原有业务配置。 - 最终返回的只读字段集合仅包含模型实际存在的字段,实现BaseAdmin对不同模型的通用适配。
内容的提问来源于stack exchange,提问作者Mehdi Aria
相关产品推荐
相关产品推荐

