-1

我有一个类,我在其中检查用户权限,并根据它们返回模型的结果列表。这是我所拥有的:

from AnnualLeave.models import Leaves, RejectedLeaves, Employee

class GetLeaves:

    def get_results(request):
        try:
            if request.user.groups.filter(name__in=['SuperAdmin']).exists():
                return Leaves.objects.all()
            elif request.user.groups.filter(name__in=['Admin']).exists():
                return Leaves.objects.filter(employee_id=Employee.objects.get(manager_id=request.user.pk))
            else:
                messages.error(request, "You are not allowed on this page")
                return render(request, 'users/home.html')

        except (Leaves.DoesNotExist, Employee.DoesNotExist):
            return []

    def process_results(request):
        leave_request = []
        for leave in GetLeaves.get_results(request):
            content = {'emp_id': leave.employee_id,
                       'emp_name': Employee.objects.get(user_id=leave.employee_id).user.get_full_name(),
                       'start_date': leave.start_date,
                       'end_date': leave.end_date,
                       'reason': leave.get_reason_display(),
                       'description': leave.description,
                       }
        ....

            leave_request.append(content)

        return leave_request

然后我像这样调用process_results函数TemplateView

class ProcessLeaveRequest(TemplateView):
    template_name = 'LMSAdmin/process_leave_request.html'

    def get(self, request, *args, **kwargs):
        return render(request, self.template_name, {'leave_requests': GetLeaves.process_results(request)})

这是错误的回溯:

Internal Server Error: /lms_admin/upcomingleaves/
Traceback (most recent call last):
  File "C:\Program Files (x86)\Python37-32\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
  File "C:\Program Files (x86)\Python37-32\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\Program Files (x86)\Python37-32\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Program Files (x86)\Python37-32\lib\site-packages\django\views\generic\base.py", line 71, in view
    return self.dispatch(request, *args, **kwargs)
  File "C:\Program Files (x86)\Python37-32\lib\site-packages\django\views\generic\base.py", line 97, in dispatch
    return handler(request, *args, **kwargs)
  File "D:\Projects\LMS\LMSAdmin\views.py", line 77, in get
    for leave in GetLeaves.process_results(request):
  File "D:\Projects\LMS\LMSAdmin\views.py", line 39, in process_results
    content = {'emp_id': leave.employee_id,
AttributeError: 'bytes' object has no attribute 'employee_id'

据我所知,它正在使用request函数中的参数读取整个网页。就像get_results函数返回的不是列表,而是整个网页。我不明白为什么会发生这种情况,因为它之前工作正常而没有任何更改。任何帮助将非常感激。

4

1 回答 1

1

您不应该从get_results. 而是引发PermissionDenied错误。

else:
    from django.core.exceptions import PermissionDenied
    messages.error(request, "You are not allowed on this page")
    raise PermissionDenied

如果要重定向到不同的页面,请在视图中处理。您可以捕获 PermissionDenied 并返回重定向。

于 2019-07-22T17:17:40.183 回答