使用django-vote时无法删除已有投票的问题求助
Django-vote 删除投票无效的解决方案
可能的问题及修复步骤
1. 未明确指定删除的投票类型(action)
你的代码中删除投票时未指定action参数,虽然django-vote的delete方法默认会删除用户对该对象的所有投票,但为了和你之前的exists检查逻辑严格匹配,避免意外删除其他类型投票,建议明确指定action:
修改后的代码:
from vote.models import UP, DOWN ... book = get_object_or_404(Book, id=pk) ... if 'upvote' in request.POST: print("I clicked upvote") if book.votes.exists(request.user.id, action=UP): print("upvote exists") # 明确指定删除UP类型的投票 book.votes.delete(request.user.id, action=UP) else: book.votes.up(request.user.id) if 'downvote' in request.POST: print("I clicked downvote") if book.votes.exists(request.user.id, action=DOWN): print("downvote exists") # 明确指定删除DOWN类型的投票 book.votes.delete(request.user.id, action=DOWN) else: book.votes.down(request.user.id)
2. 未验证用户登录状态
匿名用户的request.user.id为None,无法进行投票或删除操作。确保你的视图添加了登录验证装饰器:
from django.contrib.auth.decorators import login_required @login_required def your_view_function(request, pk): # 你的视图逻辑 ...
3. 表单未包含CSRF令牌
POST请求必须携带CSRF令牌,否则Django会拒绝请求,导致你的投票/删除代码根本不会执行。检查模板中的表单是否包含CSRF令牌:
<form method="post"> {% csrf_token %} <!-- 你的投票按钮 --> <button type="submit" name="upvote">点赞</button> <button type="submit" name="downvote">点踩</button> </form>
4. 验证投票记录是否存在
如果控制台打印了upvote exists但删除无效,建议直接查看数据库中的Vote表,确认该用户对当前Book对象确实存在对应的投票记录。可以通过Django admin查看,或者在shell中执行查询:
from vote.models import Vote from yourapp.models import Book book = Book.objects.get(id=你的pk值) user_id = 实际用户ID Vote.objects.filter(object_id=book.id, user_id=user_id, action=UP).exists()
如果查询结果为False,说明exists方法的判断出现问题,检查Book模型的继承顺序是否正确(VoteModel在前):
from vote.models import VoteModel from django.db import models class Book(VoteModel, models.Model): # 你的模型字段 title = models.CharField(max_length=100) ...
内容的提问来源于stack exchange,提问作者Aldiyar
相关产品推荐
相关产品推荐

