我正在尝试ajaxify一个没有ajax工作正常的按钮。所以我定义了一个静态文件:
$(function(){
$('#like').click(function(){
$.ajax({
type: "POST",
url: "/news/like/",
data: {
'post_id': $(this).attr('name'),
'user': '{{request.user.id}}',
'csrfmiddlewaretoken': '{{csrf_token}}'
},
dataType: "json",
success: function(response) {
alert('You liked this')
},
error: function(rs, e) {
alert(rs.responseText);
}
});
})
});
并修改了相应的视图如下:
@csrf_exempt
def like(request):
args = {}
if request.method == 'POST':
#lu = User.objects.get(id= request.user.id)
puid = int(request.POST.get('puid', None))
lu= User.objects.get(id= puid)
post_id = request.POST.get('post_id', None)
try:
liked_news = News.objects.get(id = post_id)
except:
liked_news = None
if NewsLike.objects.filter(liker=lu.id, news=post_id):
liked_news.likes -=1
liked_news.save()
NewsLike.objects.filter(news=post_id, liker=lu.id).delete()
return HttpResponse(simplejson.dumps(args),
mimetype='application/javascript')
#return HttpResponseRedirect(reverse("news.views.post_withslug", args=[liked_news.slug]))
else:
liked_news.likes +=1
liked_news.save()
messages.success(request, "You liked this news")
newliker = NewsLike(liker=lu.id, news=post_id)
newliker.save()
args.update(csrf(request))
#return HttpResponseRedirect(reverse("news.views.post_withslug", args=[liked_news.slug]))
return HttpResponse(simplejson.dumps(args),
mimetype='application/javascript')
暂时添加了'@ csrf_exempt'装饰器以消除csrf错误。
然而,当我点击我从firefox获取的按钮时
ValueError at /news/like/
invalid literal for int() with base 10: '{{request.user.id}}'
我该如何解决这个问题?
答案 0 :(得分:2)
无论如何都无需从Javascript传入当前用户。视图已经知道该信息,因为它在请求中。因此,您只需使用lu
替换视图代码中的request.user
。
答案 1 :(得分:1)
Django模板指令(如{{request.user_id}}
)无法在 static 文件中使用。这就是为什么它们静态 - 因为它们不会动态更改,并且浏览器获取的文件与存储在服务器上的文件完全相同。浏览器将接收文字字符串{{request.user_id}}
而不是请求的user_id
属性的值 - 因为在提供静态文件时不涉及Django请求。
您需要将您的静态Javascript文件替换为您从Django视图呈现的模板。模板呈现本身是使用上下文中的值替换模板文件中的模板指令的过程。