【问题标题】:How do I pass only current user data to be filtered in django-filter?如何仅传递要在 django-filter 中过滤的当前用户数据?
【发布时间】:2018-02-15 03:46:38
【问题描述】:

我正在使用django-filter 过滤我的数据。问题在于过滤器的可用选项和结果基于所有数据,而不仅仅是当前用户。

models.py

class Product(models.Model):
    title = models.CharField(max_length=264)
    description = models.CharField(max_length=264)
    date_added = models.DateField(auto_now_add=True)
    time_added = models.TimeField(auto_now_add=True)
    user = models.ForeignKey(User, default=1, on_delete=models.CASCADE)

我使用下面的代码仅过滤当前用户的结果:

filters.py

class ProductFilter(django_filters.FilterSet):

    class Meta:
        model = Product

    @property
    def qs(self):
        parent = super(ProductFilter, self).qs
        user = getattr(self.request, "user", None)
        return parent.filter(user=user).order_by("-timestamp")

在我的views.py 中,我尝试传递查询集,但没有任何改变:

class ProductsFilterView(LoginRequiredMixin, FilterView):
    model = Product
    filterset_class = ProductFilter

    def get_queryset(self, **kwargs):
        return self.model.objects.filter(user=self.request.user)

我不确定如何仅针对当前用户的数据限制可用的过滤器选项。

所以,总结一下如何只将当前用户的数据传递到过滤器集中,而不是将整个数据传递到过滤器集中,然后根据当前用户的数据过滤它们。

【问题讨论】:

  • 你能分享你的“产品”模型吗?
  • 我已经用 Product 模型更新了我的答案。

标签: python django django-filter


【解决方案1】:

filters.py

class ProductFilter(django_filters.FilterSet):

    class Meta:
        title = django_filters.CharFilter(lookup_expr='icontains')
        # And you can also do "lookup_expr='year__gt' and also 'year__lt'" 
        date_added = django_filters.NumberFilter(name='date_added', lookup_expr='year')
        class Meta:
            model = Product
            fields = [] #You can add fields that wants to be displayed

views.py

from django.contrib.auth.decorators import login_required
from django.shortcuts import render
from .filters import ProductFilter

# Function Base View
@login_required
def productfilter(request):
     user = request.user
     product_list = Product.objects.filter(user=user)
     product_filter = ProductFilter(request.GET, queryset=product_list)
     return render(request, "template_name.html", {'products': product_list})

#Class Based View
class ProductsFilterView(LoginRequiredMixin, FilterView):
    context_object_name = 'products'
    template_name = 'template_name.html'
    filter_set = ProductFilter
    def get_queryset(self):
        return Product.objects.filter(user=self.request.user)

我希望这会有所帮助。

【讨论】:

  • 为什么你创建了一个函数而不是@GiannisIordanou 的基于类的视图?
  • 我在发布问题之前尝试了 get_queryset,过滤器选项基于所有数据,而不仅仅是当前用户的数据。
猜你喜欢
  • 2018-12-10
  • 1970-01-01
  • 1970-01-01
  • 2018-12-14
  • 2023-02-17
  • 2018-06-17
  • 2023-02-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多