2013-10-04 48 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,沒問題的人!問題很明顯/模型片段是關鍵。 –

相關問題