Django 1.4用户管理列表\使用UserProfile字段筛选

Django 1.4用户管理列表\使用UserProfile字段筛选,django,django-admin-filters,Django,Django Admin Filters,编辑:我更新了代码以反映queryset筛选器中的一个错误,我在其中使用了user\uu user\u类型,已被替换为正确的userprofile\uu user\u类型 我使用的是Django 1.4,我知道有一个新功能可以为管理员创建自定义列表过滤器,它取代了FilterSpec API 我已经读过无数关于创建自定义管理员列表过滤器的帖子,但我还是被卡住了 我的用例是针对引用UserProfile模型中的字段的用户对象的列表过滤器 因此,在models.py中: class UserProf

编辑:我更新了代码以反映queryset筛选器中的一个错误,我在其中使用了user\uu user\u类型,已被替换为正确的userprofile\uu user\u类型

我使用的是Django 1.4,我知道有一个新功能可以为管理员创建自定义列表过滤器,它取代了FilterSpec API

我已经读过无数关于创建自定义管理员列表过滤器的帖子,但我还是被卡住了

我的用例是针对引用UserProfile模型中的字段的用户对象的列表过滤器

因此,在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\u type
字符串。它没有
id
属性

您需要返回
[(c,c)for c in usertypes]
,其中第一个值是传递给QS的值,第二个值是显示值


其余的不需要更改。

我知道这个空间不应该用来说“谢谢”,但你的回答太快,太准确了,我无论如何都要这么做。你太棒了。谢谢你,安托尼罗伯茨,没问题!问题很清楚/模型片段是关键。