Odoo v10联系表单报Bad Request 400(无效CSRF token)问题求助
让我来帮你排查这个Odoo v10联系表单的问题——你已经做了不少尝试,咱们一步步拆解核心问题并解决:
核心问题分析
你遇到的两个问题(初始CSRF错误、添加token后显示'false'空白页)主要源于两个关键错误:
1. 表单模型配置冲突
你的表单action指向/website_form/crm.lead(说明要创建crm.lead记录),但data-model_name却设置为mail.mail,这完全不匹配!Odoo的website_form路由是根据action中的模型(crm.lead)来处理提交数据的,错误的data-model_name会导致后端处理逻辑混乱,这很可能是提交后出现异常的根本原因。
2. CSRF Token生成方式错误
你页面中的JavaScript代码使用了request.csrf_token(None),在Odoo v10中,向csrf_token()方法传入None会生成无效的token值(比如返回false),这就是添加隐藏字段后页面显示'false'的直接原因。
具体解决方案
步骤1:修正表单模型匹配
将表单的data-model_name改为与action一致的crm.lead,修正后的表单标签应为:
<form action="/website_form/crm.lead" method="post" data-model_name="crm.lead" data-success_page="/page/website_crm.contactus_thanks" class="s_website_form form-horizontal container-fluid mt32" enctype="multipart/form-data">
说明:
mail.mail是Odoo底层的邮件模型,不需要在前端表单中直接指定,你配置的“发送邮件”动作会基于crm.lead记录自动触发邮件发送。
步骤2:正确生成CSRF Token
方案A:修正JavaScript中的Token生成
将页面中的JS代码改为:
<script type="text/javascript"> var odoo = { csrf_token: "<t t-esc=\"request.csrf_token()\"/>", }; </script>
去掉csrf_token()中的None参数,让Odoo生成有效的会话token。
方案B:确保隐藏字段的Token正确
如果你保留隐藏字段,确保QWeb语法正确(同样不要传None):
<input type="hidden" name="csrf_token" t-att-value="request.csrf_token()"/>
步骤3:调整收件人配置
你表单中的email_to隐藏字段可能多余——因为crm.lead模型本身没有这个字段,收件人应该通过CRM线索的邮件模板或发送邮件动作来配置,而不是在前端表单中指定。如果必须在前端传递,需要在website_form的字段映射中配置对应关系,但更推荐在后端动作中统一设置。
步骤4:验证测试
- 清除浏览器缓存,避免旧代码干扰;
- 打开浏览器开发者工具,在提交表单时查看网络请求:确认
csrf_token参数值是一串有效字符串(而非false); - 查看Odoo服务器日志,检查是否有字段不匹配等其他错误。
完成以上调整后,你的联系表单应该能正常提交,既不会触发CSRF错误,也能正确跳转到感谢页面。
内容的提问来源于stack exchange,提问作者Alberto Méndez

