Django,Ajax- HttpResponse 不发送 json
Django, Ajax- HttpResponse does not send json
Django 1.7.2/python3.4
这段代码大约是 'like'。
如果用户单击 'like' 按钮,ajax 调用 'pushLike'。
如果用户之前喜欢过该文章(保存在 Mysql 中),请删除 table(DB) 上的行。
或者,如果用户不喜欢该文章,请创建一行并将其插入 table(DB)。
之后,计算该文章被点击的次数。
我想将 likeCnt(count) 传递给 ajax,并将其写在按钮上。
likeCnt 值正确(我在服务器上查过mysql table)。
按钮颜色确实改变了(白色到蓝色,反之亦然),但文本没有改变。
json 似乎没有传递给 ajax。我尝试通过 'text' 类型传递数据并且它确实有效,但我希望它通过 json.
我在 HttpResponse 上尝试了简单json、json、mimetype、content_type。
请帮助我。
查看
@login_required
def pushLike(request):
pk = request.GET['writing_id']
try:
la = LikeArticles.objects.get(user = User.objects.get(username=request.user.username), article_id=pk)
if(la.is_like()):
la.delete()
likeCnt = LikeArticles.objects.filter(article_id=pk).count()
FreeBoards.objects.filter(id=pk).update(like = likeCnt)
else: #Never happens
la.like = True
la.save()
likeCnt = LikeArticles.objects.filter(article_id=pk).count()
FreeBoards.objects.filter(id=pk).update(like = likeCnt)
except ObjectDoesNotExist:
la = LikeArticles(user = User.objects.get(username=request.user.username),
article = FreeBoards.objects.get(id=pk),
like = True,
)
la.save()
likeCnt = LikeArticles.objects.filter(article_id=pk).count()
FreeBoards.objects.filter(id=pk).update(like = likeCnt)
data = {'likeCnt': likeCnt}
# return render(request, url, context)
return HttpResponse(simplejson.dumps(data), mimetype='application/javascript')
javascript
<script type="text/javascript">
$(document).ready(function(){
$('#btn-like').click(function(){
var e = $('#btn-like').css('background-color');
$.ajax({
url : '/sle/freeboards/pushLike/',
data : {'writing_id':{{writing_id}},
},
dataType : "json",
success:function(data){
alert(data.likeCnt);
if(e == 'rgb(59, 89, 152)') {
$('#btn-like').css('background-color', '#ffffff').css('color', '#000000');
$('#btn-like').text(data.likeCnt);
} else {
$('#btn-like').css('background-color', '#3b5998').css('color', '#ffffff');
$('#btn-like').text(data.likeCnt);
}
},
failure: function(data){
alert('fail!!')
}
});
});
});
</script>
您需要确保在 HttpResponse 中设置正确的 mimetype
@login_required
def pushLike(request):
...
# return json -- !!not javascript!!
return HttpResponse(simplejson.dumps(...), mimetype="application/json")
--或--
@login_required
def pushLike(request):
...
# return json -- !!not javascript!!
return JsonResponse({"your": "context dictionary"})
如果这不起作用,您是否尝试过使用 Jquery 代码解析 json?
即:
$.ajax({
...
success: function(data){
var response = $.parseJSON(data);
...
}
});
javascript 实际上可能会从您为 django 应用程序提供服务的任何内容中接收字节...因此,您实际上得到的不是 JSON 返回的字符串,而是看起来像 JSON. http://api.jquery.com/jquery.parsejson/
Django 1.7.2/python3.4
这段代码大约是 'like'。 如果用户单击 'like' 按钮,ajax 调用 'pushLike'。 如果用户之前喜欢过该文章(保存在 Mysql 中),请删除 table(DB) 上的行。 或者,如果用户不喜欢该文章,请创建一行并将其插入 table(DB)。
之后,计算该文章被点击的次数。 我想将 likeCnt(count) 传递给 ajax,并将其写在按钮上。
likeCnt 值正确(我在服务器上查过mysql table)。 按钮颜色确实改变了(白色到蓝色,反之亦然),但文本没有改变。 json 似乎没有传递给 ajax。我尝试通过 'text' 类型传递数据并且它确实有效,但我希望它通过 json.
我在 HttpResponse 上尝试了简单json、json、mimetype、content_type。
请帮助我。
查看
@login_required
def pushLike(request):
pk = request.GET['writing_id']
try:
la = LikeArticles.objects.get(user = User.objects.get(username=request.user.username), article_id=pk)
if(la.is_like()):
la.delete()
likeCnt = LikeArticles.objects.filter(article_id=pk).count()
FreeBoards.objects.filter(id=pk).update(like = likeCnt)
else: #Never happens
la.like = True
la.save()
likeCnt = LikeArticles.objects.filter(article_id=pk).count()
FreeBoards.objects.filter(id=pk).update(like = likeCnt)
except ObjectDoesNotExist:
la = LikeArticles(user = User.objects.get(username=request.user.username),
article = FreeBoards.objects.get(id=pk),
like = True,
)
la.save()
likeCnt = LikeArticles.objects.filter(article_id=pk).count()
FreeBoards.objects.filter(id=pk).update(like = likeCnt)
data = {'likeCnt': likeCnt}
# return render(request, url, context)
return HttpResponse(simplejson.dumps(data), mimetype='application/javascript')
javascript
<script type="text/javascript">
$(document).ready(function(){
$('#btn-like').click(function(){
var e = $('#btn-like').css('background-color');
$.ajax({
url : '/sle/freeboards/pushLike/',
data : {'writing_id':{{writing_id}},
},
dataType : "json",
success:function(data){
alert(data.likeCnt);
if(e == 'rgb(59, 89, 152)') {
$('#btn-like').css('background-color', '#ffffff').css('color', '#000000');
$('#btn-like').text(data.likeCnt);
} else {
$('#btn-like').css('background-color', '#3b5998').css('color', '#ffffff');
$('#btn-like').text(data.likeCnt);
}
},
failure: function(data){
alert('fail!!')
}
});
});
});
</script>
您需要确保在 HttpResponse 中设置正确的 mimetype
@login_required
def pushLike(request):
...
# return json -- !!not javascript!!
return HttpResponse(simplejson.dumps(...), mimetype="application/json")
--或--
@login_required
def pushLike(request):
...
# return json -- !!not javascript!!
return JsonResponse({"your": "context dictionary"})
如果这不起作用,您是否尝试过使用 Jquery 代码解析 json?
即:
$.ajax({
...
success: function(data){
var response = $.parseJSON(data);
...
}
});
javascript 实际上可能会从您为 django 应用程序提供服务的任何内容中接收字节...因此,您实际上得到的不是 JSON 返回的字符串,而是看起来像 JSON. http://api.jquery.com/jquery.parsejson/