Django点击Add按钮触发AttributeError: 'int'对象无get属性问题
错误原因及解决方案
核心错误原因
你的视图函数返回了整数类型,不符合Django视图的要求:
在views.py中,Book.objects.filter(pk=query).update(moved=True)会返回受影响的记录行数(整数),你直接把这个整数作为响应返回。但Django要求视图必须返回HttpResponse或其子类对象(比如render、redirect的返回值)。当中间件(这里是点击劫持防护中间件)尝试调用响应对象的get()方法处理响应头时,整数没有该属性,就抛出了AttributeError: 'int' object has no attribute 'get'。
分步解决方案
1. 修复视图的返回值
处理完图书状态更新后,不要返回update()的结果,改用重定向或重新渲染页面。推荐用重定向,避免用户刷新页面重复提交表单:
修改views.py的对应代码:
from django.shortcuts import redirect class BookList(generic.View): model = Book def get(self, request, *args, **kwargs): books = Book.objects.all() if request.GET.get('Add') == 'Add': query = request.GET.get('hidden-book') Book.objects.filter(pk=query).update(moved=True) # 重定向到当前页面,清除URL中的提交参数 return redirect(request.path) context = {'books': books} return render(request, 'main.html', context)
2. 修复模板的语法错误
main.html中隐藏输入框的value属性缺少闭合双引号,会导致表单提交的参数异常:
<form method="GET" action=""> <input type="hidden" name="hidden-book" value="{{ book.id }}"/> <input type="submit" name="Add" value="Add"/> </form>
3. 可选优化:改用POST请求处理写操作
按照HTTP规范,修改数据的操作应该用POST请求,避免浏览器预加载、书签触发等误操作:
- 模板修改:
<form method="POST" action=""> {% csrf_token %} <input type="hidden" name="hidden-book" value="{{ book.id }}"/> <input type="submit" name="Add" value="Add"/> </form>
- 视图新增POST方法处理逻辑:
class BookList(generic.View): model = Book def get(self, request, *args, **kwargs): books = Book.objects.all() context = {'books': books} return render(request, 'main.html', context) def post(self, request, *args, **kwargs): if request.POST.get('Add') == 'Add': query = request.POST.get('hidden-book') Book.objects.filter(pk=query).update(moved=True) return redirect(request.path) return redirect(request.path)
内容的提问来源于stack exchange,提问作者gabekutner
相关产品推荐
相关产品推荐

