点赞提交后数据库更新成功但重定向失败,抛出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
相关产品推荐
相关产品推荐

