Odoo 16无法识别自定义Service模型,请求技术帮助
问题排查:Odoo16网站表单提交创建Service模型报错
背景
我在Odoo16中使用网站功能搭建产品服务注册表单,已完成自定义模块开发,定义了Service模型并编写了表单提交的控制器路由,但点击提交按钮时出现报错。已在manifest.py中添加'depends': ['base','website'],问题仍未解决。
模型代码(service/model.py)
from odoo import fields, models class Service(models.Model): _name = "service.model" _description = "Service Model" name = fields.Char(string="Service Name", required=True) description = fields.Text(string="Description") price = fields.Float(string="Price", required=True) image = fields.Char(string="Image", attachment=True)
控制器代码(controllers/main.py)
@http.route('/create_service', type='http', auth='user', methods=['POST'], website=True, csrf=False) def create_service(self, **post): # Get the form data name = post.get('name') description = post.get('description') price = post.get('price') image = post.get('image') # Create the service service = request.env['service_model'].create_service(name, description, float(price), image) return request.redirect('/service_list_template')
报错情况
点击表单提交按钮时触发报错(附图)
核心排查点及修复方案
- 模型调用错误:
Odoo模型默认创建方法是create(),且需传入字典格式参数,同时你写错了模型名称(应为service.model而非service_model)。修正代码:service = request.env['service.model'].create({ 'name': name, 'description': description, 'price': float(price) if price else 0.0, 'image': image }) - 语法缩进问题:
控制器中return语句缩进错误,需与方法内代码保持同一缩进层级,否则会触发语法报错。 - 字段类型安全处理:
price从表单获取的是字符串,直接转float需做空值判断,避免非数字输入导致崩溃。 - 权限配置缺失:
需在模块security目录下的ir.model.access.csv中添加模型权限,确保登录用户有创建权限:id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink access_service_model_user,Service Model User,model_service_model,base.group_user,1,1,1,1 - CSRF安全问题:
建议开启CSRF验证,在表单中添加令牌字段:
同时移除控制器路由中的<input type="hidden" name="csrf_token" t-att-value="request.csrf_token()"/>csrf=False参数。
内容的提问来源于stack exchange,提问作者yaboiii23
相关产品推荐
相关产品推荐

