編輯:我更新了代碼,以反映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?或者我錯過了一些引用用戶個人資料的明顯方式?
感謝,
我知道這個空間不應該用來表達「謝謝」,但是你的回答非常快並且如此專注,以至於我仍然在這樣做。 你搖滾。謝謝。 –
@AnthonyRoberts,沒問題的人!問題很明顯/模型片段是關鍵。 –