2013-10-04 52 views
4

编辑:我更新了代码,以反映queryset筛选器中,我有user__user_type,一个错误已被替换为正确的userprofile__user_type。Django 1.4用户管理list_filter使用UserProfile字段

我使用Django 1.4,我知道有一个新功能为管理员创建自定义list_filters,取代了FilterSpec API。

我读过无数关于创建自定义管理list_filters的SO帖子,但我仍然卡住了。

我的用例是针对引用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',) 

但是,这似乎暗示着“本公司”是用户模型的字段。我是否需要重新定义我的User模型以包含用于UserProfile的OneToOneField?或者我错过了一些引用用户个人资料的明显方式?

感谢,

回答

3

您引用的第一个错误似乎是特定于FieldListFilter这是我从来没有使用过。我想它的关键是自动化与特定领域相关的事情。

我发现没有用它作为你的例子,因为你提供的所有选项。

我只是用一个SimpleListFilter现在...

反正你的错误是usertypes是一组c.user_type这是一个字符串。它没有id属性。

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

+0

我知道这个空间不应该用来表达“谢谢”,但是你的回答非常快并且如此专注,以至于我仍然在这样做。 你摇滚。谢谢。 –

+0

@AnthonyRoberts,没问题的人!问题很明显/模型片段是关键。 –

相关问题