Prometheus
Prometheus

Reputation: 33625

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?

Upvotes: 6

Views: 4372

Answers (3)

udeep shrestha
udeep shrestha

Reputation: 972

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)

Upvotes: 0

lampslave
lampslave

Reputation: 1503

Try self.request.user.

Why it must work.

Upvotes: 1

GwynBleidD
GwynBleidD

Reputation: 20539

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.

Upvotes: 5

Related Questions