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

如何基于budget.budget模块od_term字段值控制budget.line字段显隐

动态控制字段显示的实现方案

刚好处理过类似的需求,结合你的模型结构(budget.budget和budget.line),我分两种常见框架给你具体的实现思路:


如果你用的是Odoo

从你的模型命名风格来看,大概率是Odoo项目,这里有两种最直接的实现方式:

1. 视图层用attrs快速实现(推荐)

在budget.line的表单/列表视图XML中,给od_m1和od_q1字段添加attrs属性,关联父模型budget.budget的od_term值来控制可见性:

<!-- 假设budget.line通过one2many关联到budget.budget,视图中可以用parent引用父字段 -->
<field name="od_m1" attrs="{'invisible': [('parent.od_term', '!=', 'monthly')]}"/>
<field name="od_q1" attrs="{'invisible': [('parent.od_term', '!=', 'quart')]}"/>

这种方式不需要写Python代码,直接通过视图配置就能完成,适合简单的条件控制场景。

2. 后端重写fields_view_get实现复杂逻辑

如果需要结合更多业务规则(比如权限、其他字段联动),可以在budget.line的Python模型中重写fields_view_get方法:

from odoo import models, fields

class BudgetLine(models.Model):
    _name = 'budget.line'
    _description = 'Budget Line Item'

    od_m1 = fields.Float(string='Monthly Amount')
    od_q1 = fields.Float(string='Quarterly Amount')
    budget_id = fields.Many2one('budget.budget', string='Associated Budget', required=True)

    def fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False):
        res = super().fields_view_get(view_id=view_id, view_type=view_type, toolbar=toolbar, submenu=submenu)
        # 仅在存在关联预算时调整字段可见性
        if self.budget_id:
            term = self.budget_id.od_term
            res['fields']['od_m1']['invisible'] = term != 'monthly'
            res['fields']['od_q1']['invisible'] = term != 'quart'
        return res

如果你用的是Django

如果是Django项目,主要通过前端模板或JavaScript来实现:

1. 模板层静态渲染(适合详情页/固定场景)

在模板中根据父模型budget的od_term值判断是否渲染对应字段:

{% if budget.od_term == 'monthly' %}
    <div class="form-group">
        <label for="od_m1">Monthly Amount</label>
        <input type="number" name="od_m1" id="od_m1" class="form-control" value="{{ line.od_m1 }}">
    </div>
{% elif budget.od_term == 'quart' %}
    <div class="form-group">
        <label for="od_q1">Quarterly Amount</label>
        <input type="number" name="od_q1" id="od_q1" class="form-control" value="{{ line.od_q1 }}">
    </div>
{% endif %}

2. JavaScript动态控制(适合编辑时切换场景)

如果需要用户切换od_term时实时更新字段显示,用JS监听选择框变化:

// 监听od_term选择框的变化
document.getElementById('id_od_term').addEventListener('change', function() {
    const selectedTerm = this.value;
    const m1Field = document.getElementById('id_od_m1').closest('.form-group');
    const q1Field = document.getElementById('id_od_q1').closest('.form-group');

    if (selectedTerm === 'monthly') {
        m1Field.style.display = 'block';
        q1Field.style.display = 'none';
    } else if (selectedTerm === 'quart') {
        m1Field.style.display = 'none';
        q1Field.style.display = 'block';
    }
});

// 页面加载时初始化字段显示状态
window.addEventListener('load', function() {
    const initialTerm = document.getElementById('id_od_term').value;
    const m1Field = document.getElementById('id_od_m1').closest('.form-group');
    const q1Field = document.getElementById('id_od_q1').closest('.form-group');

    if (initialTerm === 'monthly') {
        m1Field.style.display = 'block';
        q1Field.style.display = 'none';
    } else if (initialTerm === 'quart') {
        m1Field.style.display = 'none';
        q1Field.style.display = 'block';
    }
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:15:38