我希望能够在没有页面刷新的情况下更改我的注释查询集。以下是查询集:
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
}
})
});
答案 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