Django 问题使用 POST 数据更改基于类的视图中的get_queryset

Django issue altering get_queryset in Class Based View with POST data

提问人:ViaTech 提问时间:11/10/2023 最后编辑:ViaTech 更新时间:11/11/2023 访问量:45

问:

不太确定我是怎么弄清楚的,但我正在尝试 POST 表单来更改其内容,但它没有保留过滤后的项目,它在表单期间多次调用,并且在调用时也丢失了 POST 过滤。我一定做错了什么,因为这应该很容易。我似乎只能用变量更改查询集,我如何将其移植到帖子中,有人可以帮我指出某个地方吗?get_queryset()get_querysetPOSTGETGET

我现在正在使用变量来更改过滤(这对于我之前为缩短字符串所做的编辑有些好),但我需要使用以提高效率,因为我的表单在多项选择字段中发布了 400 多个项目,因此 URL 变得非常长并且有可能导致浏览器故障,并导致 HTTP 414 错误由于数据 URL 太长。GETPOST

这是我尝试使用 POST 过滤的示例

class GeneralLedgerDatatableView(DatatableView):
    model = GeneralLedger
    datatable_class = GeneralLedgerDatatable
    template_name = 'accounting/general_ledger/general_ledger_list.html'

    def post(self, request, *args, **kwargs):
        self.object_list = self.get_queryset()

        context = self.get_context_data()

        return self.render_to_response(context)

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)

        title = 'General Ledger: Transaction Detail'

        context['title'] = title
        properties = Property.objects.filter(active=True).order_by('name')
        accounts = GLAccount.objects.all().order_by('sortable_account_identifier')

        current_property = self.request.session.get('property')
        if current_property:
            current_property = current_property.pk


        form = SelectFilterOptionsForm(self.request.POST or None, properties=properties, accounts=accounts, initial={
            'from_date': timezone.now().replace(day=1, month=1).strftime('%m/%d%/%Y'),
            'accounts': [x.pk for x in accounts],
            'to_date': timezone.now().strftime('%m/%d%/%Y'),
            'property': current_property
        })

        context['form'] = form

        return context

    def get_queryset(self):
        queryset = super().get_queryset()

        if self.request.POST:
            # THIS IS CALLED BUT SO IS GET AND ALL ARE RETURNED?
            property = self.request.POST.get('property')
            accounts = [x for x in self.request.POST.getlist('accounts') if x]
            from_date = self.request.POST.get('from_date')
            to_date = self.request.POST.get('to_date')

            q_items = list()
            if property:
                # filter_dict['journal_line_item__property__pk__in'] = properties
                q_items.append(Q(
                    property=property,
                ))

                q_items.append(Q(
                    account__pk__in=accounts,
                ))
                q_items.append(
                    Q(
                        date_entered__date__gte=datetime.datetime.strptime(from_date, '%m/%d/%Y'),
                        date_entered__date__lte=datetime.datetime.strptime(to_date, '%m/%d/%Y'),
                    )
                )

            queryset = queryset.select_related(
                'transaction_code',
                'book',
                'account',
                'property'
            ).filter(*q_items)


        return queryset
python django django-queryset django-class-based-views http-status-code-414

评论


答: 暂无答案