在 Django 5 admin 中应用
SimpleListFilter
时,无论值如何,我都会得到相同的查询集。经过一些测试,我意识到问题不仅在于 SimpleListFilter,还在于 list_filter
的所有字段。
class Monitor(models.Model):
serial = models.CharField("serial", max_length=9, primary_key=True)
status = models.PositiveSmallIntegerField("status", default=0)
class StatusFilter(admin.SimpleListFilter):
title = "status"
parameter_name = "status"
def lookups(self, request, model_admin):
return [(0, "off"), (1, "busy"), (2, "on")]
def queryset(self, request, queryset):
print("value:", self.value(), type(self.value()))
if self.value() == 0:
qs = queryset.filter(status=0)
print("queryset count", qs.count())
return qs
elif self.value() == 1:
qs = queryset.filter(status=1)
print("queryset count", qs.count())
return qs
elif self.value() == 2:
qs = queryset.filter(status=2)
print("queryset count", qs.count())
return qs
print("no filter")
return queryset
SimpleListFilter
的示例显示了正确的难度:
此屏幕截图中的数字是正确的(29,0,6)
当在过滤器上按一次(!)时,例如“打开”,我会返回多个打印结果,这比我预期的要多得多:
value: 2 <class 'str'>
no filter
value: 0 <class 'int'>
queryset count 29
value: 1 <class 'int'>
queryset count 0
value: 2 <class 'int'>
queryset count 6
value: 2 <class 'str'>
no filter
value: 2 <class 'str'>
no filter
value: 2 <class 'str'>
no filter
管理员看起来很正常,“搜索”功能也按预期工作并提供了正确的结果(我可以搜索
serial
并准确地得到一个请求和一个结果。
更多
ModelForm
:
class MonitorAdmin(admin.ModelAdmin):
list_display = [...]
readonly_fields = [...]
list_display_links = [...]
list_filter = [..., DisplayShelfStationFilter]
search_fields = [...]
ordering = [...]
def has_add_permission(self, request, obj=None):
return False
def get_urls(self):
urls = super().get_urls()
custom_urls = [...]
return custom_urls + urls
def change_view(self, request, object_id, extra_context=None):
...
return super().change_view(request, object_id, extra_context=extra_context)
您需要与字符串进行比较:
class StatusFilter(admin.SimpleListFilter):
title = "status"
parameter_name = "status"
def lookups(self, request, model_admin):
return [('0', "off"), ('1', "busy"), ('2', "on")]
def queryset(self, request, queryset):
print("value:", self.value(), type(self.value()))
if self.value() == '0':
qs = queryset.filter(status=0)
print("queryset count", qs.count())
return qs
elif self.value() == '1':
qs = queryset.filter(status=1)
print("queryset count", qs.count())
return qs
elif self.value() == '2':
qs = queryset.filter(status=2)
print("queryset count", qs.count())
return qs
print("no filter")
return queryset