首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >django- filter :使用request.user扩展过滤器查询

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

Stack Overflow用户
提问于 2014-09-01 04:42:42
回答 3查看 5.3K关注 0票数 7

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

我的模型:

代码语言:javascript
运行
复制
class Event(models.Model):
  name=models.CharField(max_length=254)
  location=models.ForeignKey(Place)
  invited_user=models.ManyToManyField(User,null=True, blank=True)

使用筛选器可以筛选具有相同位置的那些条目。这是有效的。

此外,我必须排除invited_user不是request.user的所有条目(只有当用户具有权限时,才能选择此筛选器属性)。

使用django-filter可以做到这一点吗?如果可以,如何实现?

My filter类: import django_filters from models导入事件

代码语言:javascript
运行
复制
class EventFilter(django_filters.FilterSet):
    class Meta:
        model = Event
        fields = ['location']

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

EN

回答 3

Stack Overflow用户

发布于 2018-07-12 23:25:34

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

代码语言:javascript
运行
复制
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

票数 7
EN

Stack Overflow用户

发布于 2016-03-09 18:23:55

试试这个:

代码语言:javascript
运行
复制
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
票数 2
EN

Stack Overflow用户

发布于 2014-09-13 19:12:29

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

在我的示例中,当使用dango_filters FilterView和crispy表单呈现表单时,我希望隐藏表单中的字段,以及您所描述的额外过滤,因此我覆盖了FilterView的get(),将查询集限制为用户,并使用crispy表单的布局编辑从过滤器表单中弹出不需要的字段:

代码语言:javascript
运行
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25596127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档