4

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 モデルを再定義する必要がありますか? それとも、ユーザーのプロファイルを参照する明確な方法がありませんか?

ありがとう、

4

1 に答える 1

3

FieldListFilterあなたが参照している最初のエラーは、私が一度も使用したことがないものに固有のもののようです。そのポイントは、特定の分野に関連する何かを自動化することだと思います。

あなたがすべてのオプションを提供しているので、あなたの例ではそれを使用する必要はありません。

私は今のところを使用SimpleListFilterします...

とにかくあなたのエラーは、文字列usertypesであるセットですc.user_typeid属性はありません。

[(c, c) for c in usertypes]最初の値が QS に渡される値で、2 番目の値が表示値である場所を返す必要があります。

残りは変更する必要はありません。

于 2013-10-04T17:24:19.187 に答える