Django DetailView 访问 M2M 领域的用户以限制访问?
Django DetailView getting access to users in M2M field to restrict access?
我目前正在使用 DetailView
,返回一些业务详细信息的 JsonResponse。我正在使用 test_func
和 UserPassesTestMixin
来确保只有拥有 is_admin=True
的用户才能访问这些仅限管理员的视图。
现在,在我的 BusinessDetail
模型中,我有一个名为 owner
的字段,它是一个链接到作为企业所有者的用户的 M2M 字段。当然,我还需要限制视图以确保 self.request.user
在 BusinessDetail
模型的 owner
字段中。
我已经尝试了一些东西,包括这个...
class BusinessDetailView(LoginRequiredMixin, UserPassesTestMixin, DetailView):
model = BusinessDetail
def test_func(self):
return self.request.user.is_admin
def get_object(self, queryset=None):
business = get_object_or_404(BusinessDetail, pk=self.kwargs.get('pk'))
serialized_obj = serializers.serialize('json', [business])
return serialized_obj
def get(self, request, *args, **kwargs):
try:
business = self.get_object()
logger.debug(business obj: {business}')
if self.request.user not in business.owner.all():
logger.debug('Error: Access not granted.')
return JsonResponse({'Error': 'Access restricted.'})
return JsonResponse(json.loads(business), status=200, safe=False)
except Exception as e:
logger.error(f'Error getting business detail with error: {e}')
return JsonResponse({'Error': 'DB error, return to previous page'}, status=500)
我的记录器看起来像...
==> /var/log/app/logger/debug.log <==
DEBUG 2020-12-08 21:35:19,935 /app_site/business_admin/views.py get 379 Business obj: [{"model": "authentication.business_detail", "pk": 3, "fields": {"name": "test name", "phone_no": "(111)-111-1111", "street": "111 5th st, "city": "Fort Lauderdale", "state": "Florida", "zip": "33087", "primary_email": "test@aol.com", "owner": [4], }}]
ERROR 2020-12-08 21:35:19,935 /app_site/business_admin/views.py get 379 Error getting business detail with error: 'str' object has no attribute 'owner'
是否有 different/better 方法将这些视图限制为链接到 owner
字段的用户,因为我仍然无法访问您可以看到输出的 owner
字段在记录器中?我真的无法访问 owner
字段。
在此先感谢您的帮助!
您可以通过以下方式进行限制:
def get_object(self, queryset=None):
business = get_object_or_404(
BusinessDetail,
pk=self.kwargs['pk'],
<b>owner=self.request.user</b>
)
# …
如果登录用户不是所有者的成员,那么这将return HTTP 404 响应。
然而,您的 test_func
会将视图限制为仅 admin 用户,因此只有作为所有者的管理员用户才能看到。
我目前正在使用 DetailView
,返回一些业务详细信息的 JsonResponse。我正在使用 test_func
和 UserPassesTestMixin
来确保只有拥有 is_admin=True
的用户才能访问这些仅限管理员的视图。
现在,在我的 BusinessDetail
模型中,我有一个名为 owner
的字段,它是一个链接到作为企业所有者的用户的 M2M 字段。当然,我还需要限制视图以确保 self.request.user
在 BusinessDetail
模型的 owner
字段中。
我已经尝试了一些东西,包括这个...
class BusinessDetailView(LoginRequiredMixin, UserPassesTestMixin, DetailView):
model = BusinessDetail
def test_func(self):
return self.request.user.is_admin
def get_object(self, queryset=None):
business = get_object_or_404(BusinessDetail, pk=self.kwargs.get('pk'))
serialized_obj = serializers.serialize('json', [business])
return serialized_obj
def get(self, request, *args, **kwargs):
try:
business = self.get_object()
logger.debug(business obj: {business}')
if self.request.user not in business.owner.all():
logger.debug('Error: Access not granted.')
return JsonResponse({'Error': 'Access restricted.'})
return JsonResponse(json.loads(business), status=200, safe=False)
except Exception as e:
logger.error(f'Error getting business detail with error: {e}')
return JsonResponse({'Error': 'DB error, return to previous page'}, status=500)
我的记录器看起来像...
==> /var/log/app/logger/debug.log <==
DEBUG 2020-12-08 21:35:19,935 /app_site/business_admin/views.py get 379 Business obj: [{"model": "authentication.business_detail", "pk": 3, "fields": {"name": "test name", "phone_no": "(111)-111-1111", "street": "111 5th st, "city": "Fort Lauderdale", "state": "Florida", "zip": "33087", "primary_email": "test@aol.com", "owner": [4], }}]
ERROR 2020-12-08 21:35:19,935 /app_site/business_admin/views.py get 379 Error getting business detail with error: 'str' object has no attribute 'owner'
是否有 different/better 方法将这些视图限制为链接到 owner
字段的用户,因为我仍然无法访问您可以看到输出的 owner
字段在记录器中?我真的无法访问 owner
字段。
在此先感谢您的帮助!
您可以通过以下方式进行限制:
def get_object(self, queryset=None):
business = get_object_or_404(
BusinessDetail,
pk=self.kwargs['pk'],
<b>owner=self.request.user</b>
)
# …
如果登录用户不是所有者的成员,那么这将return HTTP 404 响应。
然而,您的 test_func
会将视图限制为仅 admin 用户,因此只有作为所有者的管理员用户才能看到。