Django,将JavaScript变量传递到ListView中以过滤查询集

时间:2020-10-25 13:46:51

标签: python django ajax

我想在基于Django类的ListView中使用Ajax变量。

使用request.GET.get将变量放入视图中没问题,但是这样做似乎使我陷入了困境。

如果我正在使用def get(self, request),则在使用get_querysetget_context时会遇到问题

如果我跳过使用def get(self, request),则在将Ajax变量放入视图时会遇到问题。

我想寻求帮助以使其正常运行。最终目的是产生经过过滤的context,该清单将用于产生电子邮件。

class ProductListSendView(LoginRequiredMixin, ListView):
    model = Product
    template = 'product/product_email.html'
    
    def get(self, request):
        _req_list =  json.loads(request.GET.get('ids', None))
        _res = [int(i) for i in _req_list]
        return _res
  
    def get_queryset(self, _res):
        queryset = super(ProductListSendView, self).get_queryset()
        qs = queryset.filter(id__in=_res)
        return qs

    def get_context_data(self):
        context = super(ProductListSendView, self).get_context_data()
        context['page_title'] = 'Authors'
        self.send_email(context)
        return context

js函数(出于完整性考虑)

var getProducts = function () {
    var table = $('#product_list-table').DataTable();
    var ids = $.map(table.rows('.selected').data(), function (item) {
    return item[1]});


jQuery.ajax({
    type: 'GET',
    url: "/product/list/send/",
    data: { 
        ids: JSON.stringify(ids),
                },
    success: function(data) {},
    error: function(xhr, textStatus, error) {
        console.log(error);  
   } 
});
};

1 个答案:

答案 0 :(得分:1)

您可以覆盖get_queryset并使用self.request从那里访问请求:

    def get_queryset(self):
        _req_list =  json.loads(self.request.GET.get('ids', None))
        _ids = [int(i) for i in _req_list]
        queryset = super(ProductListSendView, self).get_queryset()
        qs = queryset.filter(id__in=_ids)
        return qs

如果您不仅需要从_ids访问get_queryset,还需要从get_context_data访问self,则可以通过get方法将其存储在super上,然后调用 def get(self, request): _req_list = json.loads(request.GET.get('ids', None)) self._ids = [int(i) for i in _req_list] return super().get(request) 进行常规处理:

get_queryset

当然,如果要这样做,则应在get_context_dataself._ids中通过while进行访问