我有一个过滤器,我需要访问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)
有没有办法将这个添加到一些将用户注入所有方法的中间件?或者,还有更好的方法?
答案 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
。
答案 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)