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

Odoo 15 event.booth已选必填字段仍提示「required field is not set」

问题:保存event.booth记录时出现必填字段错误提示(已选中却报错)

保存已打开的event.booth模型记录时,系统提示event.event为必填字段但未选中,但实际该字段已明确选中。

以下是继承event.booth的模型代码:

# -*- coding: utf-8 -*-
from odoo import models, fields, api
from . import prepare_engine as rectanglemaps_engine


class EventBooth(models.Model):
    _inherit = 'event.booth'

    name = fields.Char(string='Name', compute='_compute_name')
    display_name = fields.Char(string="Anzeigename", compute='_compute_display_name', inverse='_inverse_display_name',  store=True)

    # Verbundene Halle
    halle_id = fields.Many2one('rectanglemaps.halle', string='Halle')

    # Allgemein
    start_number = fields.Float(string="Von", default=0, required=True)
    front = fields.Float(string="Front", default=4, required=True)
    end_number = fields.Float(string="Bis", compute='_compute_end_number', inverse='_inverse_end_number', store=True)

    area = fields.Float(string="Fläche", compute='_compute_area', store=True)
    depth = fields.Float(string="Standtiefe", compute='_compute_depth', inverse='_inverse_depth', store=True)

    # Planattribute
    draw = fields.Boolean(string="Einzeichnen", default=True)
    stand_inset = fields.Float(string="Stand Einsatz", default=0)
    walls = fields.Selection([('b', 'Braun'), ('w', 'Weiß')], string="Wände")
    # carpet = fields.Selection([('1', 'orange'), ('2', 'grün'), ('3', 'grau'), ('4', 'blau')], string="Teppich")
    carpet = fields.Many2one('rectanglemaps.carpet', string='Teppich')

    # Planattribute - Wände
    available_walls = [('b', 'Braun'), ('w', 'Weiß')]
    # upper wall
    wall_1_draw = fields.Boolean(string="Obere Wand", compute='_compute_wall_1_draw', inverse='_inverse_wall', store=True)
    wall_1_start = fields.Float(string="Einsatz links")
    wall_1_end = fields.Float(string="Einsatz rechts")
    wall_1_color = fields.Selection(available_walls, string="Wandtyp", default='w')
    # rightmost wall
    wall_2_draw = fields.Boolean(string="Rechte Wand", compute='_compute_wall_2_draw', inverse='_inverse_wall', store=True)
    wall_2_start = fields.Float(string="Einsatz oben")
    wall_2_end = fields.Float(string="Einsatz unten")
    wall_2_color = fields.Selection(available_walls, string="Wandtyp", default='w')
    # lower wall
    wall_3_draw = fields.Boolean(string="Untere Wand", compute='_compute_wall_3_draw', inverse='_inverse_wall', store=True)
    wall_3_start = fields.Float(string="Einsatz links")
    wall_3_end = fields.Float(string="Einsatz rechts")
    wall_3_color = fields.Selection(available_walls, string="Wandtyp", default='w')
    # leftmost wall
    wall_4_draw = fields.Boolean(string="Linke Wand", compute='_compute_wall_4_draw', inverse='_inverse_wall', store=True)
    wall_4_start = fields.Float(string="Einsatz oben")
    wall_4_end = fields.Float(string="Einsatz unten")
    wall_4_color = fields.Selection(available_walls, string="Wandtyp", default='w')

    # Standvorschau
    preview = fields.Image(string="Vorschau")

    @api.depends('halle_id.name', 'start_number', 'front')
    def _compute_name(self):
        for record in self:
            try:
                sn = record.start_number
                if (record.start_number).is_integer():
                    sn = int(record.start_number)

                en = record.start_number + record.front
                if (en).is_integer():
                    en = int(en)

                record.name = record.halle_id.name + ' | ' + str(sn) + ' - ' + str(en)
            except:
                record.name = 'Stand'

    @api.depends('start_number', 'front')
    def _compute_end_number(self):
        for record in self:
            record.end_number = record.start_number + record.front

    def _inverse_end_number(self):
        for record in self:
            record.front = record.end_number - record.start_number

    @api.depends('start_number', 'end_number', 'depth')
    def _compute_area(self):
        for record in self:
            record.area = (record.end_number - record.start_number) * record.depth

    @api.depends('partner_id.name')
    def _compute_display_name(self):
        for record in self:
            record.display_name = record.partner_id.name

    @api.depends('start_number')
    def _compute_depth(self):
        for record in self:
            if record.start_number < 200:
                record.depth = record.halle_id.stand_s
            elif record.start_number < 400:
                record.depth = record.halle_id.stand_e
            elif record.start_number < 600:
                record.depth = record.halle_id.stand_n
            elif record.start_number < 800:
                record.depth = record.halle_id.stand_w



    @api.depends()
    def _inverse_depth(self):
        for record in self:
            pass

    @api.depends()
    def _inverse_display_name(self):
        for record in self:
            pass

    @api.depends('start_number')
    def _compute_wall_1_draw(self):
        for record in self:
            record.wall_1_draw = 200 < record.start_number < 1000

    @api.depends('start_number')
    def _compute_wall_2_draw(self):
        for record in self:
            record.wall_2_draw = record.start_number < 600 or 800 < record.start_number < 1000

    @api.depends('start_number')
    def _compute_wall_3_draw(self):
        for record in self:
            record.wall_3_draw = record.start_number < 400 or 600 < record.start_number < 1000

    @api.depends('start_number')
    def _compute_wall_4_draw(self):
        for record in self:
            record.wall_4_draw = record.start_number < 200 or 400 < record.start_number < 1000

    def _inverse_wall(self):
        for record in self:
            pass


    # used in view
    def action_confirm_stand(self):
        self.state = 'done'

    # used in view
    def action_cancel_stand(self):
        self.state = 'cancelled'


    def action_plan_redraw(self):
        self.draw_preview()

    def draw_preview(self):
        self.preview = rectanglemaps_engine.prepare_engine_stand(self)

    # used in view
    def action_create_offer(self):
        print("Create offer")

    @api.model
    def create(self, values):
        if self.halle_id != False:
            values['event_id'] = self.halle_id.event_id.id
        return super(EventBooth, self).create(values)

    @api.onchange('name', 'start_number', 'end_number', 'depth', 'wall_1_draw', 'wall_1_start', 'wall_1_end', 'wall_2_draw', 'wall_2_start', 'wall_2_end', 'wall_3_draw', 'wall_3_start', 'wall_3_end', 'wall_4_draw', 'wall_4_start', 'wall_4_end')
    def change(self):
        self.draw_preview()

    def action_create_order_rectanglemaps(self):
        action = self.env["ir.actions.actions"]._for_xml_id("rectanglemaps.action_rectanglemaps_create_order")
        ctx = {'default_event_booth_id': self.id,
               'default_event_id': self.event_id.id if self.event_id else False,
               'default_partner_id': self.partner_id.id if self.partner_id else False
               }
        action['context'] = ctx
        return action

内容的提问来源于stack exchange,提问作者unnamed-dev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 18:10:29