ユーザーが管理パネルからエントリを追加できるサイトがあるとします。各ユーザーには、自分が担当する独自のカテゴリがあります(各カテゴリには、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コードを掘り下げることは私の好きなスポーツではありません。
どうすれば目標を達成できますか?