组件1:无限级联组件
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/2976edf4bde2f6ea2ec213c21ca76cb0.png)
无限级联组件使用说明
使用场景
- 省市区/县的选择
- 部门选择、及部门以下人员的选择
- 以及其他级联适合使用的场景
优缺点
- 优点1:无限级联,通用性强,放之四海而皆准
- 优点2:数据可以一张表,也可以多张表
- 优点3:字段微组件形式,卸载安装方便
- 缺点1:在进入编辑状态时候,暂时没有实现数据的回显,逻辑复杂
模块名
模块名定义为:widget_cascade
,
calss参数说明
参数名 | 类型 | 是否必填 | 默认值 | 说明 |
---|
class | string | 是 | cascade_style | 级联组件的基础样式,可以自己再新增类名,进行样式覆盖 |
widget参数说明
参数名 | 类型 | 是否必填 | 默认值 | 说明 |
---|
widget | string | 是 | cascade_widget | 是级联字段微组件的名称,只能为cascade_widget |
options参数说明
参数名 | 类型 | 是否必填 | 默认值 | 说明 |
---|
relationModels | array | 是 | [] | 至少配置一个模型, 关联模型的列表(从父模型到子模型) |
relationModels参数说明
参数名 | 类型 | 是否必填 | 默认值 | 说明 |
---|
model | string | 是 | xxx | 模型名称 |
name_field | string | 是 | name | 字段名称 |
alive_field | string | 否 | active | 标记数据是否激活的字段名称 |
parent_id_field | string | 是 | xxx | 关联父级模型的字段,当单模型状态时,此参数必填;当多模型时,最顶级模型可以不填此参数,其余模型,必填此参数 |
如下
单级模型时
<field name="yourField"
widget="cascade_widget"
class="cascade_style"
options="{
'relationModels': [
{
'model':'widget_cascade.all_in_one',
'name_field':'name',
'parent_id_field':'parent_id',
}
]
}"
/>
多级模型时
<field name="yourField"
widget="cascade_widget"
class="cascade_style"
options="{
'relationModels': [
{
'model':'widget_cascade.sheng',
'name_field':'name',
},
{
'model':'widget_cascade.shi',
'name_field':'name',
'parent_id_field':'parent_id',
},
{
'model':'widget_cascade.xian',
'name_field':'name',
'parent_id_field':'parent_id',
}
]
}"
/>
widget_cascade字段微组件返回值说明
返回值示例:
'{"ids":"1-2-3-4","names":"四川省-成都市-新都区-zx街道","models":"widget_cascade.all_in_one-widget_cascade.all_in_one-widget_cascade.all_in_one-widget_cascade.all_in_one"}'
返回值是一个字符串对象,
ids:选中级联数据的对应id
names: 选中级联数据的对应名称
models:选中级联数据的对应模型
备注:顺序是一一对应的
说明:如果你的页面主要展示名称,那么你需要另起一个字段来切分数据,如下
yourField = fields.Char(string='选择时候名称')
name = fields.Char(string='展示时候名称',compute='_computr_name')
@api.depends('yourField')
def _computr_name(self):
for rec in self:
if rec.yourField:
rec.name = eval(rec.yourField).get('names')
else:
rec.name = None
使用方式
- 在你的模型里定义字段
yourFields = fields.Char(string='地名')
特别注意:yourFields禁止取名为name,根据odoo机制,name字段会默认显示在面包屑上面
- 在你的XML定义
<field name="yourFields" class="cascade_style" widget="cascade_widget"/>
yourFields: 为你模型中定义的字段名称
cascade_widget: 是级联字段微组件的名称,只能为cascade_widget
组件2:自定义odoo附件上传阿里云小部件
- 模块文件夹:
attachment_upload_to_oss
- 安装:项目里面搜索
上传附件至阿里云服务器组件
安装 - 定义字段
cover1 = fields.Char(string='上传附件1')
<field name="cover2" widget="new_field_upload_files"/>
<field name="cover1"
widget="new_field_upload_files"
options="{
'label': '我是按钮',
'maximum': '5',
'maxsize': '20mb',
'dir': 'wt_student',
'suffix': 'jpg,jpeg,gif,png,JPG,JPEG,GIF,PNG,pdf,PDF'
}"
/>
参数名 | 类型 | 是否必填 | 默认值 | 说明 |
---|
label | string | 否 | 上传 | 按钮上显示的文字 |
maximum | string | 否 | 不限个数 | 上传文件的最大个数 |
maxsize | string | 否 | 不限制大小 | 传单个文件的大小限制 |
dir | string | 否 | source | 上传到阿里云服务器存放的文件夹名 |
suffix | string | 否 | 不限制 | 上传文件的后缀,填写在后面的就是可以上传的文件类型 |
组件3:自定义odoo选择周组件
- 模块文件夹:
week_selector
- 安装:项目里面搜索
week_selector
安装 - 定义字段
selector_week = fields.Char(string='选择周')
<field name="selector_week" widget="week_selector"/>
<field name="selector_week"
widget="week_selector"
options="{
'format': 'week'
}"
/>
参数名 | 类型 | 是否必填 | 说明 | 默认返回类型 |
---|
format | string | 否 | 配置返回值类型 | 2021-W35|2021-08-30|2021-08-31|2021-09-01|2021-09-02|2021-09-03|2021-09-04|2021-09-05 |
参数值 | 返回类型 | 返回类型示范 |
---|
week | string | 2021-W32 |
date | string | 2021-08-16|2021-08-17|2021-08-18|2021-08-19|2021-08-20|2021-08-21|2021-08-22 |