9

ユーザーが管理パネルからエントリを追加できるサイトがあるとします。各ユーザーには、自分が担当する独自のカテゴリがあります(各カテゴリには、ForeingKey / ManyToManyFieldを介して割り当てられたエディタがあります)。

ユーザーがエントリを追加するとき、次のようにEntryAdminを使用して選択肢を制限します。

class EntryAdmin(admin.ModelAdmin):
    (...)

    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == 'category':
            if request.user.is_superuser:
                kwargs['queryset'] = Category.objects.all()
            else:
                kwargs['queryset'] = Category.objects.filter(editors=request.user)
            return db_field.formfield(**kwargs)
        return super(EntryAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)

このようにして、ユーザーがエントリを追加できるカテゴリを制限でき、完璧に機能します。

ここで注意が必要なのは、エントリの変更リスト/アクションページで、現在のユーザーのカテゴリに属する​​エントリのみを表示したいということです。私はこの方法を使用してこれを実行しようとしました:

    def changelist_view(self, request, extra_context=None):
        if not request.user.is_superuser:
            self.queryset = self.queryset.filter(editors=request.user)

しかし、私はこのエラーを受け取ります:

AttributeError:'関数'オブジェクトに属性'フィルター'がありません

これは奇妙なことです。典型的なQuerySetである必要があると思ったからです。基本的に、そのような方法は十分に文書化されておらず、大量のDjangoコードを掘り下げることは私の好きなスポーツではありません。

どうすれば目標を達成できますか?

4

1 に答える 1

18

警告:この回答は2010年のものであり、Django>=1.8では役に立ちません。

querysetModelAdminクエリセットを返すメソッドです。クラスでオーバーライドする必要がありますEntryAdmin

def queryset(self, request):
    qs = super(EntryAdmin, self).queryset(request)
    if request.user.is_superuser:
        return qs
    else:
        return qs.filter(editors=request.user)

クエリセットを変更すると、リストビューに表示されるエントリが制限されます。has_change_permissionまた、ユーザーが個々のオブジェクト編集ページでオブジェクトを編集する権限を持っていることを確認するためにオーバーライドする必要があります。詳細については、JamesBennettによる次のブログ投稿を参照してください。

http://www.b-list.org/weblog/2008/dec/24/admin/

于 2010-04-11T22:58:39.713 に答える