Jquery 如何将用户id传递到django ajax post?
我正在尝试ajaxify一个类似的按钮,它在没有ajax的情况下运行良好。所以我定义了一个静态文件:Jquery 如何将用户id传递到django ajax post?,jquery,ajax,django,Jquery,Ajax,Django,我正在尝试ajaxify一个类似的按钮,它在没有ajax的情况下运行良好。所以我定义了一个静态文件: $(function(){ $('#like').click(function(){ $.ajax({ type: "POST", url: "/news/like/", data: { 'post_id': $(this).attr('name'),
$(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_-emption”装饰符以消除csrf错误
但是当我点击firefox上的按钮时
ValueError at /news/like/
invalid literal for int() with base 10: '{{request.user.id}}'
如何修复此问题?Django模板指令(如
{{request.user\u id}}
)不能在静态文件中工作。这就是为什么它们是静态的——因为它们不会动态更改,而且浏览器获取的文件与存储在服务器上的文件完全相同。浏览器将接收文本字符串{{request.user_id}
,而不是请求的user_id
属性的值-因为在提供静态文件时不涉及Django请求
您需要将静态Javascript文件替换为从Django视图呈现的模板。模板呈现本身就是用上下文中的值替换模板文件中的模板指令的过程。无论如何都不需要从Javascript传入当前用户。视图已经知道该信息,因为它在请求中。因此,您应该将视图代码中的
lu
替换为request.user
我明白了。那么,如何从视图中呈现jquery代码段呢?与呈现任何其他模板的方式完全相同。提示不错。我从静态文件中的jquery数据中删除了“user”行,并第一次通过了ajax。但是,第二次单击按钮时,我得到:TypeError at/news/like/不可JSON序列化。有没有办法解决这个问题?