4.如何让计算字段可以过滤

你有Heroadmin ,像下面这样:

  1. @admin.register(Hero)
  2. class HeroAdmin(admin.ModelAdmin):
  3. list_display = ("name", "is_immortal", "category", "origin", "is_very_benevolent")
  4. list_filter = ("is_immortal", "category", "origin",)
  5. def is_very_benevolent(self, obj):
  6. return obj.benevolence_factor > 75

如果有一个 is_very_benevolent计算字段,你的admin页面会像这样一样: 4.如何让计算字段可以过滤 - 图1 你已经在模型字段中添加了过滤,但是你还想计算字段添加过滤,为了做到这个,你需要这样子类化SimpleListFilter

  1. class IsVeryBenevolentFilter(admin.SimpleListFilter):
  2. title = 'is_very_benevolent'
  3. parameter_name = 'is_very_benevolent'
  4. def lookups(self, request, model_admin):
  5. return (
  6. ('Yes', 'Yes'),
  7. ('No', 'No'),
  8. )
  9. def queryset(self, request, queryset):
  10. value = self.value()
  11. if value == 'Yes':
  12. return queryset.filter(benevolence_factor__gt=75)
  13. elif value == 'No':
  14. return queryset.exclude(benevolence_factor__gt=75)
  15. return queryset

并且将你的list_filter改为:list_filter = ("is_immortal", "category", "origin", IsVeryBenevolentFilter)

这样你可以过滤你的计算字段,admin就变成了这样: 4.如何让计算字段可以过滤 - 图2