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

点赞提交后数据库更新成功但重定向失败,抛出AttributeError

解决Django点赞后重定向失败的AttributeError问题

错误原因分析

我帮你排查了下这个问题,核心原因很明确:你的SongVoteCreateView的post方法在表单验证通过后,返回的是new_vote这个Vote模型实例,但Django的类视图要求必须返回HttpResponse类的实例(比如HttpResponseRedirect、RedirectResponse这些)。当你返回模型对象时,Django会尝试调用它的get()方法(因为视图返回值需要是可响应的HTTP对象),而Vote模型根本没有这个方法,所以就抛出了'Vote' object has no attribute 'get'的错误。你用HttpResponseRedirect('/album/')没问题,就是因为它是合法的HttpResponse子类。

修复步骤

  • 第一步:修改SongVoteCreateView的post方法,在表单保存成功后,不要返回Vote对象,而是调用self.get_success_url()获取预设的重定向URL,然后用redirect()返回(或者HttpResponseRedirect也可以)。
  • 第二步:可以简化表单保存的代码(非必须,但更简洁),因为get_or_create已经帮你关联了user和song,不需要再用commit=False重新赋值user。

修改后的完整代码示例

# views.py
from django.shortcuts import redirect, render

class SongVoteCreateView(View):
    form_class = SongVoteForm
    context = {}

    def get_success_url(self,**kwargs):
        song_id = self.kwargs.get('song_id')
        return reverse('music:song_detail', kwargs={'pk':song_id})

    def post(self,request,pk=None,song_id=None):
        user = self.request.user
        song_obj = Song.objects.get(pk=song_id)
        vote_obj,created = Vote.objects.get_or_create(song = song_obj,user = user)
        vote_form = SongVoteForm(request.POST, instance=vote_obj)
        
        if vote_form.is_valid():
            # get_or_create已关联user和song,直接保存即可
            vote_form.save()
            # 返回合法的重定向响应,替代原Vote对象返回
            return redirect(self.get_success_url())
        
        # 表单验证失败时,返回原页面并携带错误表单
        ctx = {'vote_form': vote_form, 'object': song_obj}
        return render(request, 'song/song_detail.html', ctx)

额外说明

  • 记得导入redirect和render模块,否则会出现找不到函数的错误。
  • 表单验证失败的处理逻辑是可选但推荐的,能让用户看到具体的错误提示,提升交互体验。

内容的提问来源于stack exchange,提问作者sanjay G D

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:33:24