You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Odoo15 Survey新增下拉菜单问题类型后答案无法存入数据库求助

Odoo 15 Survey模块新增Dropdown Menu问题类型后答案无法存入数据库的解决方案

问题分析

你新增的selection_option问题类型已完成后台配置,但提交后答案无法存入数据库,核心问题集中在模型字段依赖、保存逻辑分支和前端参数传递三个方向。

具体修复步骤

1. 标记新类型为Choice类

Odoo Survey模块依赖is_choice字段处理选择题的参数解析、答案保存等逻辑,需重写该计算字段,将新类型纳入Choice类范畴:

class SurveyQuestion(models.Model):
    _inherit = "survey.question"

    question_type = fields.Selection(
        selection_add=[("selection_option", "Dropdown Menu")]
    )

    @api.depends('question_type')
    def _compute_is_choice(self):
        super()._compute_is_choice()
        for question in self:
            if question.question_type == 'selection_option':
                question.is_choice = True

2. 优化保存逻辑分支

将selection_option与simple_choice的处理逻辑合并,避免独立分支可能引发的逻辑遗漏:

def _save_line_choice(self, question, old_answers, answers, comment):
    if not isinstance(answers, list):
        answers = [answers]

    if not answers:
        # 保存跳过标记,确保统计数据准确
        answers = [False]

    vals_list = []

    # 合并单选框与下拉框的处理逻辑
    if question.question_type in ['simple_choice', 'selection_option']:
        if not question.comment_count_as_answer or not question.comments_allowed or not comment:
            vals_list = [self._get_line_answer_values(question, answer, 'suggestion') for answer in answers]
    elif question.question_type == 'multiple_choice':
        vals_list = [self._get_line_answer_values(question, answer, 'suggestion') for answer in answers]

    if comment:
        vals_list.append(self._get_line_comment_values(question, comment))

    old_answers.sudo().unlink()
    return self.env['survey.user_input.line'].create(vals_list)

3. 验证前端模板字段命名

确保下拉框的name属性严格遵循Odoo Survey的提交规则,选项值为建议答案的ID:

<!-- 示例QWeb模板代码 -->
<div t-attf-class="oe_survey_question #{question.visibility}">
    <label><t t-esc="question.title"/></label>
    <select t-attf-name="answer_{{ question.id }}">
        <option value="">-- 请选择 --</option>
        <t t-foreach="question.suggested_answer_ids" t-as="answer">
            <option t-att-value="answer.id"><t t-esc="answer.value"/></option>
        </t>
    </select>
    <t t-if="question.comments_allowed">
        <textarea t-attf-name="comment_{{ question.id }}" placeholder="添加评论..."></textarea>
    </t>
</div>

若前端字段命名错误,Odoo无法正确捕获提交的答案值,导致保存时answer参数为空。

4. 日志调试确认参数传递

在save_lines方法中添加日志,验证提交时的参数是否正确:

import logging
_logger = logging.getLogger(__name__)

def save_lines(self, question, answer, comment=None):
    _logger.info(f"处理问题ID: {question.id}, 类型: {question.question_type}, 提交答案: {answer}")
    # 原有保存逻辑代码...

查看Odoo日志,若answer为空或非预期的建议答案ID,说明前端传递存在问题;若answer正确但仍未保存,需检查_get_line_answer_values生成的字段值是否符合要求。


内容的提问来源于stack exchange,提问作者Elhagag Abdalla

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 10:49:58