管理者はクラスModelAdmin
を使用してページをレンダリングしますが、おそらく既にご存知でしょう。そのクラスには、queryset
sharafjaffri が示唆するように、サイトにアクセスしているユーザーに基づいて、新しいフィルターに基づいてオーバーライドするメソッドがあります。
しかし、そのフィルタリングだけでは十分ではありません。また、ドロップダウンに表示される値をフィルタリングして、ユーザーが作成した値のみにする必要があります。保存したら、新しいオブジェクトをそれを追加したユーザーのポータルに関連付ける必要があります。
これが私の簡単な未テストの実装です。
class PortalAdmin(admin.ModelAdmin):
exclude = ('portal',)
def queryset(self, request):
"""
Filter the objects displayed in the change_list to only
display those for the currently signed in user.
"""
qs = super(UserAdmin, self).queryset(request)
if request.user.is_superuser:
return qs
else:
return qs.filter(portal=request.user.profile.portal)
def formfield_for_foreignkey(self, db_field, request=None, **kwargs):
the_model = db_field.related.parent_model
if hasattr(the_model,'portal'):
kwargs['queryset'] = the_model.objects.filter(portal=request.portal)
return super(PortalAdmin,self).formfield_for_foreignkey(db_field, request, **kwargs)
def save_model(self, request, obj, form, change):
if not change:
obj.portal = request.portal
obj.save()