EDIT:user__user_typeがあったクエリセットフィルターの1つの間違いを反映するようにコードを更新し、正しいuserprofile__user_typeに置き換えました。
私は Django 1.4 を使用しています。FilterSpec API を置き換える、管理者用のカスタム list_filters を作成する新しい機能があることを理解しています。
カスタム管理者 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 を含めるには、User モデルを再定義する必要がありますか? それとも、ユーザーのプロファイルを参照する明確な方法がありませんか?
ありがとう、