Django 如何使用ajax更新按钮和计数而不重定向?
我试图创建喜欢/不喜欢的功能,这样如果用户正在观看视频(例如),页面不会刷新,并使他们丢失视频中的进度。我了解如何修改Django 如何使用ajax更新按钮和计数而不重定向?,django,ajax,django-templates,django-views,Django,Ajax,Django Templates,Django Views,我试图创建喜欢/不喜欢的功能,这样如果用户正在观看视频(例如),页面不会刷新,并使他们丢失视频中的进度。我了解如何修改标记的内容,但不知道如何处理更改按钮文本/url所需的逻辑(例如:如果他们单击“喜欢”,则“喜欢”应变为“不喜欢”,并且“喜欢”的url应更改) 下面是我试图解决这个问题的方法,我还没有找到一种方法将逻辑编码到替换模板中,并删除了以前的内容,所以请原谅我没有发布HTML handle_likes.js (...) // Handle button clicks $(".like-
标记的内容,但不知道如何处理更改按钮文本/url所需的逻辑(例如:如果他们单击“喜欢”,则“喜欢”应变为“不喜欢”,并且“喜欢”的url应更改)
下面是我试图解决这个问题的方法,我还没有找到一种方法将逻辑编码到替换模板中,并删除了以前的内容,所以请原谅我没有发布HTML
handle_likes.js
(...)
// Handle button clicks
$(".like-btn").on('click', function(){
console.log("Like button was clicked!"); // sanity check
// Get the value of the original button
if ($(".like-btn").val() == "not-liked") {
like_post();
// I figured I could change the value to change the linked url
}
if ($(".like-btn").val() == "is-liked") {
unlike_post();
}
});
// Functions to handle likes/dislikes
function like_post(){
console.log("Like post called...") // sanity check
$.ajax({
url: "posting/liking_post/",
data: {
post_id : $("#post_id").val(), // Need this to get the post
post_type : $("#post_type").val() // This too
},
success: function(data) {
$('.like-count').html(data); //Try to update the count of the likes on post
$('.like-btn').html(data); // Try to change the like button
},
// Show error | display in console
error : function(xhr,errmsg,err) {
$('#results').html("<div class='alert-box alert radius' data-alert>Please contact an admin; We have encountered an error: "+errmsg+
" <a href='#' class='close'>×</a></div>"); // add the error to the dom
console.log(xhr.status + ": " + xhr.responseText); // provide a bit more info about the error to the console
}
});
};
(...)
我想出来了。我在post类中添加了两个方法,用于检查要“喜欢”的对象的“喜欢”和“不喜欢”模型,并将链接到该对象的用户作为列表返回。(方法如下)我尝试使用
self.likes.filter(object\u id=self.id)
,因为我有很多喜欢的字段(我应该用GenericRelation替换它吗?),但由于某些原因,它不起作用,所以我直接访问模型。
现在,我可以在同一个JavaScript文件中的同一页面上通过ajax处理所有事情。如果用户绕过模板逻辑(尝试多次喜欢或不喜欢…即使他们会得到唯一约束失败
异常…我是否需要该逻辑?)的逻辑在视图中
对于JavaScript来说,这是一个巨大的胜利:D
类方法
def get_liked_users(self):
all_likes = Like.objects.filter(object_id=self.id)
users = list()
for like in all_likes:
users.append(like.user)
return users
然后在模板里面我做了这个
<!--Like stuff-->
{% if request.user not in post.get_liked_users %}
<button class="like-post-btn" value="not-liked">Like</button>
{% else %}
<button class="like-post-btn" value="is-liked">Unlike</button>
{% endif %}
<div class="like-count">{{post.like_count}}<div>
<!--Dislike stuff-->
{% if request.user not in post.get_disliked_users %}
<button class="dislike-post-btn" value="not-disliked">Dislike</button>
{% else %}
<button class="dislike-post-btn" value="is-disliked">Undislike</button>
{% endif %}
<div class="dislike-count">{{post.dislike_count}}</div>
{%if request.user不在post.get_\u users%}
喜欢
{%else%}
不像
{%endif%}
{{post.like_count}}
{%if request.user不在post.get_disposted_users%}
不喜欢
{%else%}
平淡无奇
{%endif%}
{{post.count}
<!--Like stuff-->
{% if request.user not in post.get_liked_users %}
<button class="like-post-btn" value="not-liked">Like</button>
{% else %}
<button class="like-post-btn" value="is-liked">Unlike</button>
{% endif %}
<div class="like-count">{{post.like_count}}<div>
<!--Dislike stuff-->
{% if request.user not in post.get_disliked_users %}
<button class="dislike-post-btn" value="not-disliked">Dislike</button>
{% else %}
<button class="dislike-post-btn" value="is-disliked">Undislike</button>
{% endif %}
<div class="dislike-count">{{post.dislike_count}}</div>