button按钮属性汇总,初学者的学习笔记
<button
name="action_name"
type="object|workflow|action"
string="Button Label"
class="css_classes..."
icon="icon_name"
context="{'key': 'value', ...}"
states="state1,state2,..."
confirm="Confirmation Message"
attrs="{'invisible': condition, 'readonly': condition, ...}" #odoo17已经弃用了
groups="group1,group2,..."
/>
# attrs-invisible-readonly的示例操作这三个属性是视图上元素的公用属性
<field name="my_field" invisible="1"/>
<field name="my_field" invisible="'state', '=', 'draft'" />
<field name="my_field" readonly="1"/>
<field name="my_field" readonly="'state', '!=', 'confirmed'" />
常用属性
- name:按钮触发的方法名或工作流信号的名称。
- type:按钮类型,可以是 "object", "workflow", "action" 等。
- string:按钮显示的文字标签。
- class:CSS类名,用于添加额外样式。
- icon:按钮左侧显示的图标名称,来自Odoo预定义的图标库。
- context:键值对组成的字典,为按钮点击时传递给目标动作或方法的上下文变量。
- states:逗号分隔的状态列表,按钮只在当前记录处于这些状态之一时可见。
- confirm:点击按钮前弹出确认对话框显示的消息内容。
- attrs<17版本已经弃用>:键值对组成的字典,用于设置按钮的动态属性,如 invisible 和 readonly,它们可以根据条件隐藏或禁用按钮。
- groups:一组逗号分隔的用户组ID,只有属于这些用户组的用户才能看到和使用该按钮。
其它属性
- id:为按钮指定一个唯一的ID,但通常不是必需的,因为系统会自动生成。
- help:提供一个工具提示(tooltip)文本,在鼠标悬停时显示。
- target:对于链接类型按钮(如 type="action"),可以指定目标打开方式,例如 _blank 会在新窗口打开。
- special:某些情况下用于特殊类型的按钮,例如 "cancel"、"save" 或者 "create" 等预定义的特殊行为。
- nolabel:如果设置为 True,则不显示按钮标签文字,只显示图标。
另外,还有一些通过 attrs 属性内嵌的动态属性,比如:
- aria-disabled:辅助功能属性,可以配合JavaScript使用来指示按钮是否对屏幕阅读器等辅助技术禁用。
type 属性类型的行为:
- "object":
当 type="object" 时,点击按钮会触发模型(model)上的一个方法。这个方法需要在对应的Python模型文件中定义,并且方法名要与XML视图中按钮的 name 属性值相匹配。当按钮被点击时,Odoo将执行该方法并传递当前记录的上下文和数据。
- "workflow":
当 type="workflow" 时,点击按钮会发送一个工作流信号(workflow signal)。这意味着它会触发一个已配置好的工作流中的某个活动或过渡。例如,可以用来批准订单、完成任务等状态变更操作。
- "action":
当 type="action" 时,点击按钮会打开一个新的窗口或者执行一个预定义的动作(action)。动作可能是打开一个新的视图、运行一个报告、导航到另一个菜单项或其他自定义行为。动作是在Odoo的工作流系统中预先配置的,通常用于导航和界面交互。
每种类型的按钮都对应着不同的业务逻辑处理方式,在Odoo开发过程中,根据具体需求选择合适的按钮类型来实现所需功能。
在Python代码中动态设置: 可以在模型的方法中通过 self.env.context 添加上下文变量来动态影响视图中元素的 invisible 和 readonly 属性:
def action_change_visibility(self):
for record in self:
record.write({'my_field': 'some_value',
'display_my_field': True, # 假设有一个字段记录是否显示另一个字段
})
# 更新上下文以影响视图
self.env.context.update({
'invisible_my_field': not record.display_my_field,
'readonly_my_field': record.state != 'editable',
})
<field name="my_field" invisible="'invisible_my_field', '=', True" />
<field name="another_field" readonly="'readonly_my_field', '=', True" />
示例:form默认只显示主要的字段,详细内容字段被隐藏,button按钮当做功能开关使用,显示和关闭详单字段
<record id="view_your_model_form" model="ir.ui.view">
<field name="name">your.model.form</field>
<field name="model">your.model</field>
<field name="arch" type="xml">
<form>
<!-- 其他字段 -->
<field name="hidden_field1" invisible ="'show_hidden_fields', '=', False" />
<field name="hidden_field2" invisible ="'show_hidden_fields', '=', False" />
<!-- 功能开关按钮 调用模型中 toggle_hidden_fields 方法 注意 type="object"-->
<button name="toggle_hidden_fields" type="object"
string="显示/隐藏功能区"
class="oe_highlight"/>
</form>
</field>
</record>
#your_models.py
class YourModel(models.Model):
_name = 'your.model'
# 定一从此字段,控制隐藏字段的显示情况
show_hidden_fields = fields.Boolean(default=False)
def toggle_hidden_fields(self):
for record in self:
#show_hidden_fields字段的取反操作,实现开关功能
record.show_hidden_fields = not record.show_hidden_fields
return True