jquery - Django REST framework Ajax 调用仅适用于第一次调用
问题描述
我正在关注的教程有这段代码,它在页面第一次加载时有效,然后它就无效了。我已阅读有关“仅第一次使用 ajax 调用有效”的所有其他问题,但找不到相关原因。鉴于代码在页面加载时有效,我认为 jQuery 部分存在绑定问题,该问题会阻止按钮在第一次调用时更改,但我无法确定那是什么。我还尝试访问 url 端点(REST 框架端点),每次刷新页面时,计数都会正确更新。所以,问题一定出在前端的某个地方,因为它可以清楚地找到 URL 并更新一次计数,但无法在后续点击时调用 ajax。
<li>
<a class="like-btn" data-href="{{ obj.get_api_like_url }}" data-likes='{{obj.likes.count}}' href="{{ obj.get_api_like_url }}"> {{obj.likes.count }} |
{% for person in obj.likes.all %}
{{ person.userprofile.first_name }}
{% endfor %}<i class="fab fa-gratipay"></i> </a>
</li>
在我的 jQuery 代码中:
$(function(){
$(".like-btn").click(function(e)
{
e.preventDefault();
var this_ = $(this);
var likeUrl = this_.attr("data-href");
console.log("likeUrl: ", likeUrl);
var likeCount = parseInt(this_.attr("data-likes")) | 0 ;
var addLike = likeCount;
var removeLike = likeCount;
if (likeUrl)
{
$.ajax(
{
url: likeUrl, // likeUrl returns the get_api_like_url of the footer Ex/ likeUrl = {{ project.get_api_like_url }}
method: "GET", //
data: {}, // data to be sent to the server
success: function(data)
{
console.log(data);
console.log('**********************************');
console.log("Success!");
console.log("Likes: ", data.likes_num );
console.log("liked by: ", data.liked_by );
console.log("data: ", data)
if(data.liked)
{
updateText(this_, data.likes_num, "Unlike", data.liked_by);
}
else
{
updateText(this_, data.likes_num, "Like", data.liked_by);
}
console.log("updated the count button")
},
error: function(error)
{
console.log("error: ", error)
}
})
}
});
function updateText(btn, newCount, verb, extra){
btn.text(newCount + " " + verb + " " + extra); // e.g. 2 like or 1 unlike
}
});
以下是完整的 REST 框架代码:
类 ProFormaLikeAPI(APIView): #authentication_classes = (authentication.SessionAuthentication,) permission_classes = (permissions.IsAuthenticated,)
def get(self, request, pk=None, format=None):
user = self.request.user
the_pk = pk
updated = False
liked = False
obj = get_object_or_404(Project, pk=the_pk)
the_url = obj.get_absolute_url()
if user.is_authenticated():
if user in obj.likes.all():
liked = False
obj.likes.remove(user)
else:
liked = True
obj.likes.add(user)
likes_num = obj.likes.all().count()
if likes_num > 1:
people = 'persons'
else:
people = 'person'
liked_by = [ user.userprofile.first_name for user in obj.likes.all() ]
updated = True
data = {'updated': updated,
'liked': liked,
'likes_num': likes_num,
'liked_by': liked_by,
}
return Response(data)
解决方案
您应该防止所有未来的 AJAX 请求被缓存(请参阅此讨论:防止浏览器缓存 AJAX 调用结果)。您可以在 jQuery 代码中使用缓存属性 (cache: false):
... if (likeUrl) { $.ajax( { url: likeUrl, // likeUrl returns the get_api_like_url of the footer Ex/ likeUrl = {{project.get_api_like_url }} method: "GET", // data: {}, cache: false, success: function(data) { console.log(data); console.log('**********************************'); ...
也许问题出现在您面前是因为您在 Django 项目中使用了缓存(django memcached 和 ajax 请求)。
推荐阅读
- agora.io - 抓麦克风和麦克风掉落时如何解决集市中的轨道禁用错误?
- python - Python中的顺序函数IO设计模式
- java - 多次发送同一个请求,使用不同的参数,由于第一次请求响应而发送另一个请求
- r - For - 循环遍历行和列,填充一个空数据帧,具体取决于另一个数据帧 (r) 的值
- android - 目标需要一个项目来执行但是这个目录中没有POM但是目录中有POM文件
- javascript - React 的 Plotly.js uirevision 不起作用
- html - 如何让文本溢出在具有动态宽度的容器中工作?
- terraform - 如何忽略terraform中的块
- apache - 从 Apache 到 Nginx 的 Imperva WAF X-Forwarded-For HTTP Header 的某个指南需要解释
- python - 在 Python 中声明全局对象