django-filter:使用request.user扩展过滤器查询

use*_*786 5 django filter django-models django-filter django-tables2

我需要在django-filter请求中添加一个额外的filter属性(在后台)。

我的模特:

class Event(models.Model):
  name=models.CharField(max_length=254)
  location=models.ForeignKey(Place)
  invited_user=models.ManyToManyField(User,null=True, blank=True)
Run Code Online (Sandbox Code Playgroud)

使用过滤器可以过滤具有相同位置的那些条目。可以了

进一步,我必须排除所有那些不是所邀请的用户的request.user条目(只有在用户具有权限的情况下才可以选择此过滤器属性)。

使用django-filter可能吗,如果可以,怎么办?

我的过滤器类:从模型导入事件中导入django_filters

class EventFilter(django_filters.FilterSet):
    class Meta:
        model = Event
        fields = ['location']
Run Code Online (Sandbox Code Playgroud)

我的工作基于:如何使用Django通用视图过滤表?

ude*_*tha 7

you can access the request object in FilterSet.qs property.

class EventFilter(django_filters.FilterSet):
    class Meta:
        model = Event
        fields = ['location']
    
    @property
    def qs(self):
        queryset=super(EventFilter, self).qs
        if request.user.has_perm("app_label.has_permission"):       
            return queryset.exclude(invited_user!=self.request.user)
        return queryset      
Run Code Online (Sandbox Code Playgroud)

docs https://rpkilby.github.io/django-filter/guide/usage.html#filtering-the-primary-qs


Ker*_*ge0 2

我认为在您的情况下,您可以通过修改视图中的查询集来完成此操作,您应该能够在其中访问 request.user。因此你不需要深入研究 django-filter,

就我而言,当使用 dango_filters FilterView 以及脆皮表单来渲染表单时,我想隐藏表单中的字段以及您所描述的附加过滤,因此我覆盖了 FilterView 的 get() ,将查询集限制为用户,并使用脆皮表单的布局编辑从过滤器表单中弹出不需要的字段:

def get(self, request, *args, **kwargs):
    """
    original code from django-filters.views.BaseFilterView - added admin check
    """
    filterset_class = self.get_filterset_class()
    self.filterset = self.get_filterset(filterset_class)
    self.object_list = self.filterset.qs
    # If not admin, restrict to assessor's own centre and clients
    if not request.user.get_profile().is_admin:
        self.object_list = self.object_list.filter(attendee__assessor=request.user)
        self.filterset.form.helper.layout[0].pop(2)  # centres filter
        self.filterset.form.helper.layout[0].pop(1)  # assessors filter
    context = self.get_context_data(filter=self.filterset,
                                    object_list=self.object_list)
    return self.render_to_response(context)
Run Code Online (Sandbox Code Playgroud)