You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 01:21:04