从 Ajax GET 方法接收数据后,使用 Django Listview 类重新加载页面

Posted

技术标签:

【中文标题】从 Ajax GET 方法接收数据后,使用 Django Listview 类重新加载页面【英文标题】:Reload page with Django Listview class after receiving data from Ajax GET Method 【发布时间】:2017-11-19 19:17:07 【问题描述】:

我正在使用 js 日历选择器插件将日期值传递给 django 视图,并根据它应该将新视图呈现到同一网页的日期。因为在这个视图中我从不同的表中提取大量数据,所以我使用 ListView 类。

问题是,当我在 listview 中使用 get 函数时,我能够捕获从 ajax 传递的数据。如何将该数据传递给 get_context_data 以重新生成上下文并重新加载页面?

谢谢

这是我的 js:

<script type="text/javascript">
        $(function() 
            var start = moment().subtract(29, 'days');
            var end = moment();

            function cb(start, end) 
                $('#reportrange span').html(start.format('MMMM D, YYYY') + ' - ' + end.format('MMMM D, YYYY'));    
                $.ajax(
                    type: 'GET',
                    url: "/csr/summary/",
                    data: 
                        csrfmiddlewaretoken: $('input[name=csrfmiddlewaretoken]').val(),
                        from_date: from_date,
                        to_date: to_date,
                    ,
                    success: function (response) 
                    
                );

                console.log("done here");
            

            $('#reportrange').daterangepicker(
                startDate: start,
                endDate: end,
                ranges: 
                    'Today': [moment(), moment()],
                    'Yesterday': [moment().subtract(1, 'days'), moment().subtract(1, 'days')],
                    'Last 7 Days': [moment().subtract(6, 'days'), moment()],
                
            , cb);
            cb(start, end);
        );
    </script> 

这是我的观点:

class CsrView(generic.ListView):
    template_name = 'dash/csr.html'
    context_object_name = 'csr_list'
    from_date = ""
    to_date = ""

    def get(self, request, *args, **kwargs):
        self.from_date = self.request.GET.get("from_date", "")
        self.to_date = self.request.GET.get("to_date", "")
        print "Django get method getting:", self.from_date, " - ", self.to_date
        return super(CsrView, self).get(request, *args, **kwargs)

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

        # if self.request.method == "GET":
        #     print "get method triggered"
        #     self.from_date = self.request.GET.get("from_date", "")
        #     self.to_date = self.request.GET.get("to_date", "")
        #     context['testing'] = "lalala" + self.from_date

        context['title'] = "CSR"
        context['other_stuff'] = .....

【问题讨论】:

你在 GET 请求中使用 CSRF 做什么? 【参考方案1】:

从get方法调用super时,get_context_data方法应该按照超类的super方法调用。

查看下面的url,您将在get方法的最后一个context = self.get_context_data()中看到

https://ccbv.co.uk/projects/Django/1.11/django.views.generic.list/ListView/#get

【讨论】:

知道了,现在我也可以获取 get_context_data 中的数据了,但是如何使用新数据重新加载页面呢?谢谢 为什么要重新加载页面?如果您显示分页等数据,我认为您应该使用 js 附加数据 我没有为此使用分页。这假设是一个简单的 get 方法。但是由于我在js中使用了这个日历插件,所以我必须使用js来创建一个get请求,并且这个请求必须将数据传递给django view并重新加载页面。我对 js 和 ajax 很陌生,所以我想知道最好的方法是什么。

以上是关于从 Ajax GET 方法接收数据后,使用 Django Listview 类重新加载页面的主要内容,如果未能解决你的问题,请参考以下文章

Ajax异步传值以及后端接收参数的4种方式

前端与后端的数据交互(jquery ajax+python flask)

前端ajax异步传值以及后端接收参数的几种方式

前端ajax异步传值以及后端接收参数的几种方式

jQuery Ajax 前端和后端数据交互的问题

Ajax学习