@permission_required decorator returns no user attribute in View error

Viewed 72

I'm working with Django-admin panel. I have created a custom view file to add a file manager. To make file uploading safe, I just added permission_required decorator. But it throws an error 'FileBrowser' object has no attribute 'user'.

Here is my code.

class FileBrowser(ListView):
    model = File
    paginate_by = 30
    template_name = "file_manager/browser.html"
    extra_context = {
        'file_type': type,
        'title': "Media Browser",
    }

    @permission_required('file_manager.view_file')
    def dispatch(self, request, *args, **kwargs):
        file_type = request.GET.get('type')
        self.queryset = File.objects.filter(type=file_type)
        self.extra_context['value_to'] = request.GET.get('value_to')
        self.extra_context['image_to'] = request.GET.get('image_to')
        self.extra_context['form'] = FileForm()
        return super().dispatch(request, *args, **kwargs)
2 Answers

You can not decorate the method like that, since such decorator does not expect self as first parameter. It thus sees self as the request parameter.

What you can do is work with a @method_decorator decorator, like:

from django.utils.decorators import method_decorator

@method_decorator(permission_required('file_manager.view_file'), name='dispatch')
class FileBrowser(ListView):
    # …
    
    def dispatch(self, request, *args, **kwargs):
        # …

For a class-based view however, you can work with the PermissionRequiredMixin [Django-doc]

from django.contrib.auth.mixins import PermissionRequiredMixin

class FileBrowser(PermissionRequiredMixin, ListView):
    permission_required = 'file_manager.view_file'
    # …

    def dispatch(self, request, *args, **kwargs):
        # …

There was a small mistake in my code. But I didn't noticed that. I simply forgot to use @method_decorator and directly wrote @permission_required decorator.

This was what I wrote.

@permission_required('file_manager.view_file')
def dispatch(self, request, *args, **kwargs):
    .......
    .......
    return super().dispatch(request, *args, **kwargs)

This is what I changed to:

   @method_decorator(permission_required('file_manager.view_file'))
   def dispatch(self, request, *args, **kwargs):
       .......
       .......
       return super().dispatch(request, *args, **kwargs)

Now it's working fine.
Related