【问题标题】:Django-Filter FilterSet Show Only User Generated ObjectsDjango-Filter FilterSet 仅显示用户生成的对象
【发布时间】:2020-09-17 20:57:54
【问题描述】:

我正在使用 django-filter 表单,它正在过滤“关联组合”的所有对象我怎样才能使它只向用户显示他们创建的对象?

错误信息:

'StatsFilter' object has no attribute 'fields'

过滤器.py

class StatsFilter(django_filters.FilterSet):
    associated_portfolios = django_filters.ModelMultipleChoiceFilter(queryset=associated_portfolios)

    class Meta:
        model = Trade
        fields = ['type', 'asset', 'symbol', 'broker', 'patterns', 'associated_portfolios']

    def __init__(self, request, *args, **kwargs):
        super(StatsFilter, self).__init__(*args, **kwargs)
        self.fields['associated_portfolios'].queryset = Trade.objects.filter(user=request.user)]

views.py

class StatsView(LoginRequiredMixin, FilterView):
    model = Trade
    template_name = 'dashboard/stats.html'
    filterset_class = StatsFilter

    def get_context_data(self, **kwargs):
        filter = StatsFilter(self.request.GET, queryset=self.get_queryset())
        context = super().get_context_data(**kwargs)
        context['filter'] = filter
        context['get_users_trades'] = Trade.objects.get_users_trades('tj3admin')
        context['get_largest_winning_trade'] = filter.qs.aggregate(max_value=Max('profit_loss_value_fees'))['max_value']
        return context

【问题讨论】:

  • 您应该使用类方法get_fields 访问这些字段,这可能会解决您的问题。
  • 谢谢,虽然改成 self.get_fields()['associated_portfolios'] = Portfolio.objects.filter(user=request.user)

标签: python django django-forms django-views django-filter


【解决方案1】:

啊,现在我想起来了:将 ModelMultipleChoiceFilter 的 queryset 参数设置为接受请求作为唯一参数的可调用对象:


def portfolio_filtered_queryset(request):
    return Trade.objects.filter(user=request.user)

class StatsFilter(django_filters.FilterSet):
    associated_portfolios = django_filters.ModelMultipleChoiceFilter(queryset=porfolio_filtered_queryset)

The view:
class StatsView(LoginRequiredMixin, FilterView):
    model = Trade
    template_name = 'dashboard/stats.html'
    filterset_class = StatsFilter

    def get_context_data(self, **kwargs):
        # Must pass in request!
        filter = StatsFilter(self.request.GET, queryset=self.get_queryset(), request=self.request)
        context = super().get_context_data(**kwargs)
        context['filter'] = filter
        context['get_users_trades'] = Trade.objects.get_users_trades('tj3admin')
        context['get_largest_winning_trade'] = filter.qs.aggregate(max_value=Max('profit_loss_value_fees'))['max_value']
        return context

django_filters.filters.QuerySetRequestMixin.get_request() 中,请求实例是从父级获取的。但是我在django_filters.filterset.BaseFilterSet 或试图通过其他方式获取请求的具体情况中看不到任何逻辑。因此,如果您希望使用 QuerySetRequestMixin,则必须将请求传递给 StatsFilter。

【讨论】:

  • 再次感谢您的尝试,我认为我们正朝着正确的方向前进,因为我之前也尝试过这条路线。唯一的问题是现在我收到错误消息:'NoneType' object has no attribute 'user'
  • 那是因为你没有将请求传递给StatsFilter1()的构造函数。
  • 我希望.. 已经修复了那个类型,是一个相同的测试表格(虽然很好)
  • 更新了,不是你实例化了错误的类型,而是你没有传入请求。
  • 你,我的朋友,是一个传奇,哈哈,现在重新阅读你的评论更有意义。在过去的几个小时里,我尝试了很多解决方法,答案很简单。非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2023-02-26
  • 1970-01-01
  • 1970-01-01
  • 2020-11-06
  • 2019-09-24
  • 2013-05-29
  • 1970-01-01
  • 2020-12-11
相关资源
最近更新 更多