Odoo15 Survey新增下拉菜单问题类型后答案无法存入数据库求助
问题分析
你新增的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
相关产品推荐
相关产品推荐

