Django点击劫持中间件报错:表单无'get'属性,提交表单失败求助
解决Django表单提交的'get'属性错误及点击劫持中间件问题
看起来你遇到的问题根源在于视图函数没有正确处理GET请求的情况,同时缺少必要的响应返回逻辑。让我一步步帮你分析和解决:
错误原因解析
你的原始视图只处理了「用户已激活 + POST请求 + 表单验证通过」这一种场景,当用户第一次访问页面(GET请求)或者表单验证失败时,视图没有返回任何HTTP响应。这种情况下,Django无法生成合法的响应对象,导致点击劫持中间件(XFrameOptionsMiddleware)无法正常工作,同时抛出'AjoutBanque'对象没有'get'属性的错误——因为中间件期望处理的是HttpResponse对象,而你的视图返回了None或者未正确传递响应。
修正后的视图函数
修改你的视图,让它同时处理GET和POST请求,并确保任何分支都返回合法的响应:
from django.shortcuts import render, redirect from .forms import AjoutBanque from .models import banque def AjoutBanq(request): # 先处理用户未激活的情况,直接重定向或返回错误 if not request.user.is_active: return redirect('/login/') # 替换成你的实际登录页面URL if request.method == 'POST': # POST请求时,绑定表单数据 form2 = AjoutBanque(request.POST) if form2.is_valid(): print("valid") # 保存到数据库 clt = banque( nom=form2.cleaned_data['nom'], agence=form2.cleaned_data['agence'], rib=form2.cleaned_data['rib'] ) clt.save() return redirect('/banque/') else: # GET请求时,创建空表单实例 form2 = AjoutBanque() # 无论是GET请求,还是POST请求但表单验证失败,都渲染模板返回表单 return render(request, '你的表单模板.html', {'form': form2})
额外的优化建议
模板渲染注意事项
确保你的模板中正确渲染表单,并包含CSRF令牌(Django强制要求):<form method="post"> {% csrf_token %} {{ form.as_p }} <button type="submit">提交表单</button> </form>RIB字段的合理性
银行RIB通常可能包含非数字字符(部分国家的RIB有校验字母),如果你的业务场景中RIB允许非数字,建议把IntegerField改成CharField并添加验证器:from django.core.validators import RegexValidator class AjoutBanque(forms.Form): nom = forms.CharField() agence = forms.CharField() rib = forms.CharField( validators=[RegexValidator(r'^[\dA-Z]+$', '请输入有效的RIB编号')] )代码规范优化
模型类名建议遵循PEP8规范,使用大驼峰命名,比如把banque改成Banque,提升代码可读性。
内容的提问来源于stack exchange,提问作者Elroum
相关产品推荐
相关产品推荐

