您遇到的问题是在 Django2 项目中,多个帖子都有 Like 按钮,每个按钮都使用相同的表单 ID,当通过 Ajax 提交时可能会出现问题。
<!-- 模板中 -->
<form class="like-form" data-post-id="{{ post.id }}">
{% csrf_token %}
<button type="submit" class="like-btn">Like</button>
</form>
$(document).ready(function(){
$('.like-form').submit(function(e){
e.preventDefault();
var form = $(this);
var postId = form.data('post-id');
$.ajax({
type: 'POST',
url: '/like-post/', // 替换为您的实际URL
data: {
'post_id': postId,
'csrfmiddlewaretoken': form.find('input[name="csrfmiddlewaretoken"]').val()
},
success: function(response){
if(response.liked){
form.find('.like-btn').text('Unlike');
} else {
form.find('.like-btn').text('Like');
}
// 可以更新点赞数等
},
error: function(xhr, errmsg, err){
console.log(xhr.status + ": " + xhr.responseText);
}
});
});
});
from django.http import JsonResponse
from django.views.decorators.http import require_POST
from django.views.decorators.csrf import csrf_exempt
@require_POST
@csrf_exempt # 如果使用CSRF token可以去掉这个装饰器
def like_post(request):
post_id = request.POST.get('post_id')
# 这里添加您的点赞逻辑
# 例如:
# post = get_object_or_404(Post, id=post_id)
# liked = post.toggle_like(request.user)
return JsonResponse({'liked': True}) # 根据实际情况返回
from django.urls import path
from . import views
urlpatterns = [
path('like-post/', views.like_post, name='like_post'),
]
如果要进一步优化,可以考虑:
这个解决方案解决了重复ID的问题,同时提供了清晰的点赞功能实现路径。
没有搜到相关的沙龙