在django-filter方法中获取当前用户

时间:2015-09-17 09:57:02

标签: python django

我有一个过滤器,我需要访问request.user。但是,django-filter没有通过它。如果没有使用凌乱的inspect.stack(),有没有办法让当前用户进入下面的方法member_filter

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=???)

例如,这有效,但感觉不对......

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)

有没有办法将这个添加到一些将用户注入所有方法的中间件?或者,还有更好的方法?

3 个答案:

答案 0 :(得分:4)

是的,你可以做到,而且很容易。

首先,在__init__类中定义ClubFilter方法,该方法将需要一个额外的参数:

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

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

将用户保存到ClubFilter内的属性后,您可以在过滤器中使用它。只需记住在FilterSet内的视图中传递当前用户。

答案 1 :(得分:0)

尝试if

Why it must work.

答案 2 :(得分:0)

您可以在FilterSet.qs属性中访问请求实例,然后在其中过滤主查询集。

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)