私は以前、実際の管理コードを変更せずにdjangoアプリにこれを正確に実行させました。むしろ、クエリセットフィルターで拡張されたメソッドのいくつかを使用してadmin.ModelAdminのサブクラスを作成します。これにより、ユーザーが所有するレコードのみが表示されます(この場合、ビジネスはAUTH_PROFILE_MODELです)。これを実現する方法については、Web上にさまざまなブログがあります。
この手法を使用して、リストのフィルタリング、フォーム選択ボックス、保存を検証するフォームフィールドなどを使用できます。
これまでのところ、NFAから1.0、1.1まで存続していますが、このメソッドはAPIの変更の影響を受けやすくなっています。
実際には、アプリに新しいモデルを追加したので、新しいモデルの新しい行レベルのアクセスレベルの管理フォームを生成する方がはるかに速いことがわかりました。ユーザーfkを使用して新しいモデルを作成するか、AdminFilterByBusinessをサブクラス化するか、または単に
admin.site.register(NewModel,AdminFilterByBusiness)
カスタムが必要ない場合。それは動作し、非常に乾燥しています。
ただし、公開されている他のdjangoアプリを利用できないリスクがあります。したがって、構築するプロジェクトでは、この手法を慎重に検討してください。
http://code.djangoproject.co/wiki/NewformsHOWTOに触発された以下のフィルター管理クラスの例
#AdminFilterByBusiness {{{2
class AdminFilterByBusiness(admin.ModelAdmin):
"""
Used By News Items to show only objects a business user is related to
"""
def has_change_permission(self,request,obj=None):
self.request = request
if request.user.is_superuser:
return True
if obj == None:
return super(AdminFilterByBusiness,self).has_change_permission(request,obj)
if obj.business.user == request.user:
return True
return False
def has_delete_permission(self,request,obj=None):
self.request = request
if request.user.is_superuser:
return True
if obj == None:
return super(AdminFilterByBusiness,self).has_delete_permission(request,obj)
if obj.business.user == request.user:
return True
return False
def has_add_permission(self, request):
self.request = request
return super(AdminFilterByBusiness,self).has_add_permission(request)
def queryset(self, request):
# get the default queryset, pre-filter
qs = super(AdminFilterByBusiness, self).queryset(request)
#
if not (request.user.is_superuser):
# filter only shows blogs mapped to currently logged-in user
try:
qs = qs.filter(business=request.user.business_set.all()[0])
except:
raise ValueError('Operator has not been created. Please Contact Admins')
return qs
def formfield_for_dbfield(self, db_field, **kwargs):
""" Fix drop down lists to populate as per user request """
#regular return for superuser
if self.request.user.is_superuser:
return super(AdminFilterByBusiness, self).formfield_for_dbfield(
db_field, **kwargs)
if db_field.name == "business":
return forms.ModelChoiceField(
queryset = self.request.user.business_set.all()
)
#default
return super(AdminFilterByBusiness, self).formfield_for_dbfield(db_field, **kwargs)