【问题标题】:django-filter: extend filter query with request.userdjango-filter:使用 request.user 扩展过滤器查询
【发布时间】:2014-10-25 02:37:36
【问题描述】:

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

我的模特:

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

使用过滤器可以过滤具有相同位置的条目。这是有效的。

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

django-filter 是否可以实现,如果可以,如何实现?

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

class EventFilter(django_filters.FilterSet):
    class Meta:
        model = Event
        fields = ['location']

我的作品基于:How do I filter tables with Django generic views?

【问题讨论】:

    标签: django django-models filter django-tables2 django-filter


    【解决方案1】:

    我认为在您的情况下,您可以通过修改视图中的查询集来做到这一点,您应该能够访问 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)
    

    【讨论】:

      【解决方案2】:

      试试这个:

      class EventListView(BaseFilterView):
          ...
          def get_filterset(self, *args, **kwargs):
              fs = super().get_filterset(*args, **kwargs)
              fs.filters['location'].field.queryset = fs.filters['location'].field.queryset.filter(user=self.request.user)
              return fs
      

      【讨论】:

        【解决方案3】:

        您可以在 FilterSet.qs 属性中访问请求对象。

        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      
        

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

        【讨论】:

          猜你喜欢
          • 2021-04-02
          • 2010-12-11
          • 2017-03-28
          • 2018-09-18
          • 2019-04-03
          • 2018-01-31
          • 1970-01-01
          • 1970-01-01
          • 2019-05-16
          相关资源
          最近更新 更多