简体   繁体   中英

Get Current User in django-filter Method

I have a filter where I need to access the request.user . However, django-filter does not pass it. Without using the messy inspect.stack() is there a way to get the current user in the method member_filter below?

class ClubFilter(django_filters.FilterSet):
    member = django_filters.MethodFilter(action='member_filter')

    class Meta:
        model = Club
        fields = ['member']

    def member_filter(self, queryset, value):
        # get current user here so I can filter on it.
        return queryset.filter(user=???)

For example this works but feels wrong...

def member_filter(self, queryset, value):
        import inspect
        request_user = None
        for frame_record in inspect.stack():
            if frame_record[3] == 'get_response':
                request_user = frame_record[0].f_locals['request'].user
                print(request_user)

is there maybe a way to add this to some middleware that injects user into all methods? Or is there a better way?

Yes, you can do it, and it's very easy.

First, define __init__ method in your ClubFilter class that will take one extra argument:

class ClubFilter(django_filters.FilterSet):
    # ...

    def __init__(self, *args, **kwargs):
        self.user = kwargs.pop('user')
        super(ClubFilter, self).__init__(*args, **kwargs)

With having your user saved into attribute inside ClubFilter , you can use it in your filter. Just remember to pass current user from your view inside FilterSet .

Try self.request.user .

Why it must work.

you can access the request instance in FilterSet.qs property, and then filter the primary queryset there.

class ClubFilter(django_filters.FilterSet):
member = django_filters.MethodFilter(action='member_filter')

class Meta:
    model = Club
    fields = ['member']

    @property
    def qs(self):
        primary_queryset=super(ClubFilter, self).qs
        return primary_queryset.filter(user=request.user)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM