编辑:我更新了代码以反射(reflect)查询集过滤器中的一个错误,其中我的 user__user_type 已替换为正确的 userprofile__user_type。
我正在使用 Django 1.4,并且我知道有一个新功能可以为管理员创建自定义 list_filters,它取代了 FilterSpec API。
我读过无数关于创建自定义管理 list_filters 的帖子,但我仍然陷入困境。
我的用例是引用 UserProfile 模型中字段的 User 对象的 list_filter。
所以在 models.py 中:
class UserProfile(models.Model):
user = models.OneToOneField(User, unique=True)
user_type = models.CharField(max_length=25, choices=USER_TYPES, default='Client')
...
在 admin.py 中:
from django.contrib import admin
from django.contrib.admin import site, ModelAdmin, ChoicesFieldListFilter
from django.contrib.auth.models import User
from django.contrib.auth.admin import UserAdmin
from models import UserProfile
class UserTypeFilter(ChoicesFieldListFilter):
title = 'User Type'
parameter_name = 'user_type'
def lookups(self, request, model_admin):
usertypes = set([c.user_type for c in UserProfile.objects.all()])
return [(c.id, c.user_type) for c in usertypes]
def queryset(self, request, queryset):
if self.value():
return queryset.filter(userprofile__user_type=self.value())
else:
return queryset
class UserAdmin(UserAdmin):
list_filter = ('is_staff', UserTypeFilter)
inlines = (UserProfileInline, )
admin.site.unregister(User)
admin.site.register(User, UserAdmin)
这是我收到的错误:
'UserAdmin.list_filter[1]' is 'UserTypeFilter' which is of type FieldListFilter but is not associated with a field name.
我最初尝试使用 SimpleListFilter,并收到此错误
'unicode' object has no attribute 'id'
这是有道理的,因为我的 user_type 字段是一个选择字段,并且选择是 unicode 对象。
文档显示了这个示例:
class PersonAdmin(UserAdmin):
list_filter = ('company__name',)
但这似乎暗示“公司”是用户模型上的一个字段。我是否需要重新定义我的用户模型以包含 UserProfile 的 OneToOneField?或者我是否缺少一些引用用户个人资料的明显方法?
谢谢
最佳答案
您引用的第一个错误似乎特定于我从未使用过的 FieldListFilter
。我想它的重点是自动化与特定领域相关的东西。
我认为它对您的示例没有任何用处,因为您提供了所有选项。
我现在只使用 SimpleListFilter
...
无论如何,你的错误是usertypes
是一组c.user_type
,它是一个字符串。它没有 id 属性。
您需要返回[(c, c) for c in usertypes]
,其中第一个值是传递给 QS 的值,第二个值是显示值。
其余的不需要改变。
关于Django 1.4 用户管理 list_filter 使用 UserProfile 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19187027/