如何使用AJAX更改我的查询集?

时间:2017-02-07 09:45:35

标签: python ajax django django-queryset

我希望能够在没有页面刷新的情况下更改我的注释查询集。以下是查询集:

comment_list = Comment.objects.filter().order_by('-score__upvotes')
new_comments_list = Comment.objects.filter().order_by('-timestamp')

然后我的模板是

{% for comment in comment_list %}
    {{ comment }}

...

有没有办法使用AJAX(无页面刷新)将{% for comment in comment_list %}更改为{% for comment in new_comments_list %}

或者可能将comment_list的值更改为等于Comment.objects.filter().order_by('-timestamp')

修改

视图:

def new_comments(request):
    if request.is_ajax():
        print('ajax') #prints ajax
        comment_list = Comment.objects.filter().order_by('-timestamp')
        html = render_to_string('article.html', {'comment_list': comment_list})
        return HttpResponse(html)

ajax电话:

$('.comments_new').on('click', function() {
    $.ajax({
        type: 'GET',
        url: '/new_comments/',
        data: {
            csrfmiddlewaretoken: $("input[name='csrfmiddlewaretoken']").val(),
        },
        success: function (data) {
            console.log(data.comment_list); // undefined
        }
    })
});

1 个答案:

答案 0 :(得分:1)

我猜,您在尝试使用comment_list进行页面渲染时使用new_comment_list并使用ajax而不进行修改

{% for comment in comment_list %}
    {{ comment }} 
{%  endfor %}

代码的问题是comment_list是一个查询集,在页面呈现时(在通过Django模板引擎之后)在服务器端上进行评估.Javascript不理解queryset。它理解HTML或JSON。因此,您必须修改脚本,以便为ajax请求返回HTML或JSON。

我建议你重写你的观点,如:

from django.template.loader import render_to_string

if request.is_ajax(): 
     new_comments_list = Comment.objects.filter().order_by('-timestamp')
     # you can keep your_div_template as a included template in your main template
     html = render_to_string('your_div_template', {'comment_list': new_comments_list})
     return HttpResponse(html)

并编写您的前端以生成此HTML代码。 这是一个链接,可以使用ajax更好地解释渲染:Returning Rendered Html via Ajax