Odoo(十):基本视图
在上一篇中我们Odoo我们可以发现,能够为给定模型生成默认视图。在实实际开发中,业务应用程序永远不会接受默认视图。相反,我们至少应该以一种合乎逻辑的方式组织各个领域。
视图在带有操作和菜单的 XML 文件中定义。它们是 ir.ui.view
模型的实例。
在我们的房地产模块中,我们需要以一种合乎逻辑的方式组织字段:
- 在列表(树)视图中,我们希望显示的不仅仅是名称。
- 在表单视图中,字段应该被分组。
- 在搜索视图中,我们必须能够搜索的不仅仅是名称。具体来说,我们需要一个“可用”属性的过滤器和一个按邮政编码分组的快捷方式。
常见的视图有如下几种:
- form视图
- tree视图
- kanban视图
- graph视图
- gatt视图
每种视图的结构不一样,下面我们将简单介绍一下Form、Tree、Search视图的使用方法.
列表(list/tree)视图
列表视图,也叫做树视图,以表格的格式显示记录
它的根元素是tree
。tree视图的最基本版本只是列出了要在表中显示的所有字段(其中每个字段都是一列)
例如
<record id="crm_lost_reason_view_tree" model="ir.ui.view"> <field name="name">crm.lost.reason.tree</field> <field name="model">crm.lost.reason</field> <field name="arch" type="xml"> <tree string="Channel" editable="bottom"> <field name="name"/> </tree> </field> </record>
Form视图
表单用于创建和编辑单个记录。
它们的根元素是<form>
。它们由高级结构元素(组和笔记本)和交互元素(按钮和字段)组成。
例如
<record id="crm_lost_reason_view_form" model="ir.ui.view"> <field name="name">crm.lost.reason.form</field> <field name="model">crm.lost.reason</field> <field name="arch" type="xml"> <form string="Lost Reason"> <sheet> <div class="oe_button_box" name="button_box"> <button name="action_lost_leads" type="object" class="oe_stat_button" icon="fa-star"> <div class="o_stat_info"> <field name="leads_count" class="o_stat_value"/> <span class="o_stat_text"> Leads</span> </div> </button> </div> <widget name="web_ribbon" title="Archived" bg_color="bg-danger" attrs="{'invisible': [('active', '=', True)]}"/> <div class="oe_title"> <div class="oe_edit_only"> <label for="name"/> </div> <h1 class="mb32"> <field name="name" class="mb16"/> </h1> <field name="active" invisible="1"/> </div> </sheet> </form> </field> </record>
Search视图
搜索视图与列表视图和表单视图略有不同,因为它们不显示 内容。虽然它们适用于特定模型,但它们用于过滤其他视图的内容(通常是聚合视图,例如List)。除了用例的差异之外,它们的定义方式相同。
它们的根元素是<search>
。此视图的最基本版本仅列出需要快捷方式的所有字段
Odoo 生成的默认搜索视图提供了一个快捷方式来过滤name
。在自定义搜索视图中添加用户可能过滤的字段是很常见的。
例如
<record id="view_delivery_carrier_search" model="ir.ui.view"> <field name="name">delivery.carrier.search</field> <field name="model">delivery.carrier</field> <field name="arch" type="xml"> <search string="Delivery Carrier"> <field name="name" string="Carrier" /> <field name="delivery_type"/> <separator/> <filter string="Archived" name="inactive" domain="[('active', '=', False)]"/> <group expand="1" string="Group By"> <filter string="Provider" name="provider" context="{'group_by':'delivery_type', 'residual_visible':True}"/> </group> </search> </field> </record>
搜索视图还可以包含<filter>
元素,这些元素充当预定义搜索的切换。过滤器必须具有以下属性之一:
domain
:将给定域添加到当前搜索context
:为当前搜索添加一些上下文;使用键group_by
对给定字段名称的结果进行分组
域
在 Odoo 中,域对记录的条件进行编码:域是用于选择模型记录子集的标准列表。每个标准都是一个三元组,包含一个字段名、一个运算符和一个值。如果指定字段满足应用于值的运算符的条件,则记录满足条件。
例如,当在Product模型上使用时,以下域选择单价大于1000的所有服务:
[('product_type', '=', 'service'), ('unit_price', '>', 1000)]
默认情况下,条件与隐式 AND 相结合,这意味着需要满足每个条件才能使记录与域匹配。逻辑运算符 &
(AND)、|
(OR) 和!
(NOT) 可用于显式组合条件。它们用于前缀位置(运算符插入在其参数之前而不是介于两者之间)。
例如,要选择“属于服务或单价不在1000 到 2000 之间”的产品:
['|', ('product_type', '=', 'service'), '!', '&', ('unit_price', '>=', 1000), ('unit_price', '<', 2000)]
代码
代码
addons_my\estate\views\estate_property_view.xml
<?xml version="1.0" encoding="UTF-8" ?> <odoo> <data> <!--tree 视图--> <record id="estate_property_tree_view" model="ir.ui.view"> <field name="name">房产广告</field> <field name="model">estate.property</field> <field name="arch" type="xml"> <tree> <field name="name" string="name"/> <field name="bedrooms" string="bedrooms"/> <field name="postcode" string="postcode"/> <field name="living_area" string="living area"/> <field name="expected_price" string="expected price"/> <field name="date_availability" string="available from"/> </tree> </field> </record> <!--form 视图--> <record id="estate_property_form_view" model="ir.ui.view"> <field name="name">房产广告</field> <field name="model">estate.property</field> <field name="arch" type="xml"> <form> <sheet> <h1> <field name="name" string="name"/> </h1> <group> <group> <field name="postcode" string="postcode"/> <field name="date_availability" string="available from"/> </group> <group> <field name="expected_price" string="expected price"/> <field name="selling_price" string="selling price"/> </group> </group> <notebook> <page string="Description"> <group> <field name="description" string="description"/> <field name="bedrooms" string="bedrooms"/> <field name="living_area" string="living area"/> <field name="facades" string="facades"/> <field name="garage" string="garage"/> <field name="garden" string="garden"/> <field name="garden_area" string="garden_area"/> </group> </page> </notebook> </sheet> </form> </field> </record> <!--search 视图--> <record id="estate_property_search_view" model="ir.ui.view"> <field name="name">房地产广告</field> <field name="model">estate.property</field> <field name="arch" type="xml"> <search> <field name="name" string="标题"/> <field name="postcode" string="邮编"/> <field name="expected_price" string="预期价格"/> <field name="bedrooms" string="卧室"/> <field name="living_area" string="居住面积"/> <field name="facades" string="外立面"/> <filter name="" string="卧室大于3" domain="[('bedrooms','>','3')]"/> <filter name="" string="卧室大于3,居住面积大于200" domain="[('bedrooms','>',3),('living_area','>',200)]"/> <group string="group by"> <field name="balcony_orientation" string="阳台方向" context="{'group_by':'balcony_orientation'}"/> </group> </search> </field> </record> <record id="estate_property_action_window" model="ir.actions.act_window"> <field name="name">房地产广告</field> <field name="res_model">estate.property</field> <field name="view_mode">tree,form,search</field> </record> <menuitem id="estate_property_menu_action" action="estate_property_action_window"/> </data> </odoo>
效果
tree视图
form视图
search视图
搜索
筛选
分组
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库