教程地址:Odoo 14 开发教程_哔哩哔哩_bilibili
菜单
<!-- 菜单-->
<!-- parent :指向的菜单路径-->
<!-- action : 指向动作id-->
<menuitem id="estate_property_sec_menu_action"
sequence="20"
name="房地产"
parent="estate_property_menu_action"
action="estate_property_act_window"/>
搜索
<!--搜索-->
<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="邮政编码"/>
<!--domain:将给定域添加到当前搜索-->
<filter name="搜索" domain="['|',('name','=','碧桂园'),('expected_price','>=','10')]"/>
<!--context:为当前搜索添加一些上下文;使用键group_by对给定字段名称的结果进行分组-->
<group string="Group By">
<filter name="garden_orientation" string="朝向" context="{'group_by':'garden_orientation'}"/>
</group>
</search>
</field>
</record>
选择展示/隐藏 optional
<!--打开 列表头右上角 三个点 optional="hide" 默认不展示当前字段 optional="show" 默认展示当前字段-->
<field name="id" string="编号" optional="hide"/>
<field name="name" string="姓名" optional="show"/>
上传头像
# model添加 二进制文件字段类型
images = fields.Binary(string="头像")
# views 添加 上传头像视图
<!--widget 类型为image 图片类型,class 为oe_avatar头像类型-->
<field name="images" widget="image" string="头像" class="oe_avatar"/>
隐藏展示
<!--invisible 可以隐藏显示-->
<field name="expected_price" string="预期价格" invisible="1"/>
排序
1.在model里面设置排序
# 排序 属性名(多个属性用逗号隔开)+排序规则
_order = "id,name desc"
2.在views视图里面设置排序
<kanban default_order="id,name asc">
注意:(视图排序优先级高于model排序)
批量编辑
<!--multi_edit="1" 打开批量修改功能-->
例:<tree multi_edit="1">
打开字段修改记录
# tracking 属性可打开字段修改记录
name = fields.Char(string='姓名', tracking=True)
compute 计算字段
total_area = fields.Float(string="总面积", compute="_compute_total_area")
best_price = fields.Float(string="总价格", compute="_compute_best_price")
"""
计算房屋总面积
@api.depends(依赖的是谁)
"""
@api.depends('living_area', 'garden_area')
def _compute_total_area(self):
for obj in self:
obj.total_area = obj.living_area + obj.garden_area
@api.depends('offer_ids.price')
def _compute_best_price(self):
for obj in self:
best_price = 0.0
for line in obj.offer_ids:
best_price += line.price
obj.best_price = best_price
onchange 装饰器(根据某些字段值改变表单其他数据的机制)
# 默认给定字段的值会修改其他字段的值。使用‘onchange’ 注意(规范) 不要在onchange写复杂逻辑
# 选择花园时花园方向默认选择为北方向 花园区为10
@api.onchange('garden')
def _onchange_garden(self):
if self.garden:
self.garden_orientation = 'North'
self.garden_area = 10
else:
self.garden_orientation = None
self.garden_area = 0
重写 create创建保存方法
# 重写 odoo create创建保存方法
@api.model
def create(self, vals):
if len(vals.get('name')) != 0:
vals['random_id'] = uuid.uuid3(uuid.NAMESPACE_DNS, vals.get('name'))
res = super(EstateProperty, self).create(vals)
return res
重写name_get方法
# 重写后,在点击Tree视图的内容会,Odoo 会调用 name_get 方法,重写了 name_get方法后 视图上会展示 重写后的数据
def name_get(self):
result = []
for x in self:
name = '[' + x.name + ']' + ' ' + x.postcode
result.append((x.id, name))
return result
评论/消息
# model 继承 邮件
_inherit = ['mail.thread', 'mail.activity.mixin']
# views添加
<div class="oe_chatter">
<!--消息关注者-->
<field name="message_follower_ids" widget="mail_followers"/>
<!--展示消息记录-->
<field name="message_ids" widget="mail_thread"/>
<!--计划活动-->
<field name="activity_ids"/>
</div>
<!--pdf-->
<record id="estate_property_print_pdf" model="ir.actions.report">
<field name="name">打印</field>
<field name="model">estate.property</field>
<field name="report_type">qweb-pdf</field>
<!-- report_name report_file 对应pdf model 视图里面的id -->
<field name="report_name">estate.estate_property_model_pdf_view</field>
<field name="report_file">estate.estate_property_model_pdf_view</field>
<field name="print_report_name">'Print Badge - %s' % (object.name).replace('/', '')</field>
<field name="binding_model_id" ref="model_estate_property"/>
<field name="binding_type">report</field>
</record>
<template id="estate_property_model_pdf_view">
<!--使用基本布局-->
<t t-call="web.basic_layout">
<div class="page">
<t t-foreach="docs" t-as="estate">
<div class="col-md-6">
<table style="width:243pt; height:153pt; border: 1pt solid black; border-collapse:separate; border-radius:8pt; margin:5pt">
<td style="width:33%;" valign="center">
<table style="width:77pt; height:150pt">
<tr style="height:30%">
<td align="center" valign="center">
</td>
</tr>
<tr style="height:70%;">
<td align="center" valign="center">
<img t-if="estate.images" t-att-src="image_data_uri(estate.images)"
style="max-height:85pt;max-width:90%" alt="Employee Image"/>
</td>
</tr>
</table>
</td>
<td style="width:67%" valign="center">
<table style="width:155pt; height:85pt">
<tr>
<th>
<div style="font-size:15pt; margin-bottom:0pt;margin-top:0pt;"
align="center">
<t t-esc="estate.name"/>
</div>
</th>
</tr>
</table>
</td>
</table>
</div>
</t>
</div>
</t>
</template>
持续更新。。。。。
自学项目地址: