odoo-031 odoo13和odoo16的网站上添加显示变体描述 Website Add Variant Description

news2025/2/1 7:23:17

文章目录

  • 测试环境
  • 需求描述
  • 实现步骤
  • 实际效果
  • 思路说明

测试环境

Odoo 版本: odoo13 和 odoo16
Python 版本:3.6.9
操作系统:Ubuntu 18.04

需求描述

  1. 添加变体描述,显示在 form 视图;
  2. 在网站上动态显示产品变体描述。

实现步骤

  1. 创建模块 product_vat_16;
  2. 在产品变体product.product上添加字段 variant_desc 作为变体描述字段;
    odoo13 和 odoo16 同代码:
class ProductProduct(models.Model):
    _inherit = 'product.product'

    variant_desc = fields.Text('Variant Description')

个人理解:
product.templateproduct.product,product.template 是产品,个人理解为产品模板,通用型的;porduct.product是产品变体,也可以说是个性化产品。所以变体描述添加在这个模型中。
如果添加到 product.template 中的话,每个变体描述都是一样的内容,不管修改哪个最后所有的产品的变体描述都是最后一次修改的内容。

  1. 对应的 form 视图上显示该字段;
    odoo16:
<record id="view_product_product_variant_desc_form" model="ir.ui.view">
        <field name="name">product.product.desc.form</field>
        <field name="model">product.product</field>
        <field name="inherit_id" ref="product.product_normal_form_view"/>
        <field name="arch" type="xml">
            <page name="invoicing" position="after">
                <page name="variant_desc" string="Variant Description">
                    <group>
                        <label for="variant_desc" string=""/>
                        <div>
                            <field name="variant_desc"/>
                        </div>
                    </group>
                </page>
            </page>
        </field>
    </record>

odoo13:

<record id="view_product_product_desc_form" model="ir.ui.view">
        <field name="name">product.product.desc.form</field>
        <field name="model">product.product</field>
        <field name="inherit_id" ref="product.product_normal_form_view"/>
        <field name="arch" type="xml">
            <page name="purchase" position="after">
                <page name="variant_desc" string="Variant Description">
                    <group>
                        <field name="vat_desc2"/>
                    </group>
                </page>
            </page>
        </field>
    </record>
  1. 如何在网站上动态显示变体描述内容;(修改网站上售卖产品的 qweb 模板)
    odoo16:
    在 ADD TO CART (加入购物车)下面显示变体描述的内容:
<?xml version="1.0" encoding="utf-8" ?>
<odoo>

    <template id="inherit_website_template" inherit_id="website_sale.product">
        <xpath expr="//div[@id='wrap']/section/div[@id='product_detail_main']/div[@id='product_details']/form//div[@id='o_wsale_cta_wrapper']" position="after">
            <div>
                <span class="oe_variant_desc"/>
            </div>
        </xpath>
    </template>

</odoo>

odoo13:
在 ADD TO CART (加入购物车)上面显示变体描述的内容:

<?xml version="1.0" encoding="utf-8" ?>
<odoo>
    <template id="inherit_website_template2" inherit_id="website_sale.product">
        <xpath expr="//div[@id='wrap']/section//div[@id='product_details']/form//div/t[1]" position="after">
            <span class="oe_variant_desc"/>
        </xpath>
    </template>

</odoo>
  1. 网页上的返回内容中添加变体内容;
    odoo13 和 odoo16 同:
class ProductTemplate(models.Model):
    _inherit = 'product.template'

    def _get_combination_info(self, combination=False, product_id=False, add_qty=1, pricelist=False,
                              parent_combination=False, only_template=False):
        res = super()._get_combination_info(combination=combination, product_id=product_id, add_qty=add_qty, pricelist=pricelist,
                                            parent_combination=parent_combination, only_template=only_template)
        if res.get('product_id'):
            product = self.env['product.product'].browse(res.get('product_id'))
            res.update({'vat_desc2': product.vat_desc2})
        return res
  1. 根据不同的属性组合显示不同的变体描述,需要修改js,继承修改后的 js 文件;
    odoo16:
odoo.define('product_vat_v16.product_variant', function (require) {
'use strict';

    var VariantMixin = require('website_sale.VariantMixin');

    const newOnChangeCombination = VariantMixin._onChangeCombination;
    VariantMixin._onChangeCombination = function (ev, $parent, combination) {
        var $variant_desc = $parent.find(".oe_variant_desc");
        $variant_desc.text(combination.variant_desc);

        newOnChangeCombination.apply(this, [ev, $parent, combination]);
    };

});

odoo13:

odoo.define('product_vat_v13.product_variant', function (require) {
'use strict';

    var publicWidget = require('web.public.widget');
    var VariantMixin = require('sale.VariantMixin');

    publicWidget.registry.WebsiteSale = publicWidget.Widget.extend(VariantMixin, {
        selector: '.oe_website_sale',
        events: _.extend({}, VariantMixin.events || {}, {
            'click input.js_product_change': 'onChangeVariant',
            'change .js_main_product [data-attribute_exclusions]': 'onChangeVariant',
            'change oe_optional_products_modal [data-attribute_exclusions]': 'onChangeVariant',
        }),

        // override to get the variant desc when access first
        start: function () {
            var self = this;
            var def = this._super.apply(this, arguments);

            _.each(this.$('div.js_product'), function (product) {
                $('input.js_product_change', product).first().trigger('change');
            });

            // This has to be triggered to compute the "out of stock" feature and the hash variant changes
            this.triggerVariantChange(this.$el);
            return def;
        },

        // change product attribute method start from this method
        onChangeVariant: function (ev) {
            return VariantMixin.onChangeVariant.apply(this, arguments);
        },

        // change product variant attributes and change the desc at the same time
        _onChangeCombination: function (ev, $parent, combination) {
            var $vat_desc2 = $parent.find(".oe_variant_desc");
            $vat_desc2.text(combination.vat_desc2);
        },
        
    });

});

引入 js 文件到 assets_fontend.xml:

<?xml version="1.0" encoding="utf-8"?>
<odoo>
    <data>
        <template id="assets_frontend" name="Website Variant Desc" inherit_id="web.assets_frontend">
            <xpath expr="." position="inside">
                <script type="text/javascript" src="/product_vat_v13/static/src/js/product_variant.js"/>
            </xpath>
        </template>
    </data>
</odoo>

  1. 增加中文翻译。

实际效果

  1. 新增产品的变体的属性如下;
    在这里插入图片描述

  2. 新增变体描述如下;
    在这里插入图片描述

  3. 网站上显示变体描述。
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述

思路说明

  1. 如何判断需要修改哪个 qweb 模块?
    在产品页面,点击转到网站的时候,地址栏会显示一个当前页面渲染的地址,通过这个地址找到对应的渲染页面。

  2. 在网站上如何实现属性联动后变体描述也能对应的修改?
    一个思路,在变体上,价格跟图片是联动,就是选择不同的属性组合后,价格跟图片会自动跟着改变。参考这个代码去摸索。
    odoo16是比较新的版本,我比较熟悉odoo13,所以先在13上面摸索,掌握关键后在16上复现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/762822.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

QT之智能指针

如果没有智能指针&#xff0c;程序员必须保证new对象能在正确的时机delete&#xff0c;四处编写异常捕获代码以释放资源&#xff0c;而智能指针则可以在退出作用域时(不管是正常流程离开或是因异常离开)总调用delete来析构在堆上动态分配的对象。 来看看一个野指针例子 程序将会…

在 3ds Max 中创建逼真的玻璃材质

推荐&#xff1a; NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 尽管本教程基于 3ds Max&#xff0c;但相同的设置适用于许多其他 3D 产品。 注意&#xff1a;单击每个步骤中的缩略图可查看更大的屏幕截图&#xff0c;其中包括视口和用户界面的相关部分。 步骤 1由于本教…

Linux的权限管理精细总结

&#xff08;该图由AI绘制 关注我 学习AI画图&#xff09; 目录 一、权限概述 1、权限的基本概念 2、为什么要设置权限 3、Linux用户身份类别 4、user文件拥有者 5、group文件所属组内用户 6、other其他用户 7、特殊用户root 二、普通权限管理 1、ls -l命令查看文件…

LED显示屏的8个常见信号干扰因素及解决方法

LED显示屏在使用过程中可能会受到多种信号干扰因素的影响&#xff0c;导致显示效果不理想或出现问题。以下是LED显示屏常见的信号干扰因素以及对应的解决方法&#xff1a; 1&#xff0c;电源干扰&#xff1a; 干扰因素&#xff1a;电源波动、电源噪声等。 解决方法&#xff1a…

jenkins发布使用邮件添加审批

首先安装好Email Extension Plugin插件并在 system下配置好邮件 然后配置流水线需要的参数 ![在这里插入图片描述](https://img-blog.csdnimg.cn/418fc89bfa89429783a1eb37d3e4ee26.png#pic_center pipeline如下&#xff1a; def skipRemainingStages false //是否跳过生…

【原创】实现GPT中Transformer模型之框架概念

作者&#xff1a;黑夜路人 时间&#xff1a;2023年7月 GPT是什么意思 GPT的全称是 Generative Pre-trained Transformer&#xff08;生成型预训练变换模型&#xff09;&#xff0c;它是基于大量语料数据上训练&#xff0c;以生成类似于人类自然语言的文本。其名称中的“预训练”…

Knife4j-的使用(详细教程)

文章目录 前言一、简介二、版本参考三、基本使用1. 导入相关依赖2. 比对效果3. 增强特性应用 四、Spring-Cloud 整合1. 项目准备2. 实现步骤2.1 依赖引入2.2 编写配置类2.2.1基础信息配置2.2.2 配置接口信息2.2.3 安全认证配置 2.3 常用注解的使用2.3.1 Api2.3.2 ApiOperation2…

计算机组成2——存储系统

1. 硬件构成、工作原理、评价指标 2.主存储器 基本构成为DRAM&SRAMROM&#xff0c;工作原理为串行访问特点是采用多体交叉提高读取速度 RAM工作原理 SRAM的读写过程如下&#xff1a; WE控制读写&#xff1b; CS为片选信号&#xff1b; VCC为接地端&#xff1b; GND为…

GitLab 16.1创建新成员

GitLab 16.1界面有明显的变化,Admin Area在界面中不容易找到。 下面是找到Admin Area的方法。 本来是可以通过红框的链接找到Admin Area,但是这链接是http://127.0.0.1:8000/root,无法直接访问。 这里有两个方法进入。 方法1 将链接直接改成服务器ip,例如服务器ip是19…

【技术指南】3D转换工具HOOPS Exchange的功能特征和典型使用场景全解析(二)

什么是 HOOPS Exchange&#xff1f;HOOPS Exchange 是一组软件库&#xff0c;可以帮助开发人员在开发应用程序时读取和写入主流的 2D 和 3D 格式。HOOPS Exchange 支持 在主流的3D 文件格式中读取 CAD 数据&#xff0c;并支持将 3D 数据转换为 PRC 数据格式&#xff0c;这是一种…

Godot实用代码-存取存档的程序设计

1. Settings.gd 全局变量 用于保存玩家设置 对应Settings.json 2. Data.gd 全局变量 用于保存玩具数据 对应Data.json 实践逻辑指南 1.在游戏开始的时候&#xff08;游戏场景入口的_ready()处&#xff0c; Settings.gd

ceph对象存储和安装dashborad

一、ceph–RadosGW对象存储 数据不需要放置在目录层次结构中&#xff0c;而是存在于平面地址空间内的同一级别&#xff1b; 应用通过唯一地址来识别每个单独的数据对象; 每个对象可包含有助于检索的元数据&#xff1b; 在Ceph中的对象存储网关中&#xff0c;通过RESTful API在…

医院制剂研发与真实世界评价论坛圆满闭幕

医院制剂是新药的摇篮和宝库&#xff0c;现代科技为医院制剂的研发和转化赋能。在新时代新政策下&#xff0c;2023年07月16日&#xff0c;由湖南省药学会医院制剂研发与真实世界评价专业委员会&#xff08;下称“专委会”&#xff09;主委单位湖南易能生物医药有限公司&#xf…

划片机的技术分解

划片机是一种切割设备&#xff0c;主要用于将硬脆材料&#xff08;如硅晶圆、蓝宝石基片、LED基片等&#xff09;分割成较小的单元。其工作原理是以强力磨削为划切机理&#xff0c;通过空气静压电主轴带动刀片与工件接触点的划切线方向呈直线运动&#xff0c;将每一个具有独立电…

Java 设计模式——观察者模式

目录 1.概述2.结构3.案例实现3.1.抽象观察者3.2.观察对象3.3.具体观察者3.4.具体观察对象3.5.测试 4.优缺点5.使用场景6.JDK 源码解析——Observable / Observer6.1.Observable 类6.2.Observer 接口6.3.案例 1.概述 观察者模式 (Observer Pattern) 是一种行为型设计模式&#…

如何管理数据库用户

目录 一、数据库用户管理 新建用户 查询数据库中的用户 重命名用户名 删除用户 修改当前用户密码 修改其他用户密码 二、数据库用户授权 授权 允许用户在指定终端远程连接MySQL并拥有指定权限 撤销权限 授权用户权限总结 一、数据库用户管理 新建用户 命令&#x…

DP485替代MAX485 RS485/RS422 收发器芯片

DP485E 是一款 5V 供电、半双工、低功耗、低摆率&#xff0c;完全满足 TIA/EIA-485 标准要求的 RS-485收发器。DP485E 工作电压范围为 4.75~5.25V&#xff0c;具备失效安全&#xff08;fail-safe&#xff09;、过温保护、限流保护、过压保护&#xff0c;控制端口热插拔输入等功…

phoenix os在vmware workstation上的安装

一、点击创建新的虚拟机配置 选择“安装程序光盘映像文件”&#xff0c;选择你刚刚下好的PhoenixOS ISO镜像文件&#xff0c;点击下一步 分配虚拟机大小。随便你分配&#xff0c;只要大小恰当(系统大小预计会安装软件的大小3G以上的缓存及其他文件存放空间)&#xff0c;反正我就…

opencv -11 图像运算之按位逻辑运算(图像融合图像修复和去除)

按位逻辑运算是一种对图像进行像素级别的逻辑操作的方法&#xff0c;使用OpenCV的按位逻辑运算函数可以对图像进行位与&#xff08;AND&#xff09;、位或&#xff08;OR&#xff09;、位非&#xff08;NOT&#xff09;和位异或&#xff08;XOR&#xff09;等操作。 通俗点就是…

Java NIO 和 AIO 总结

title: Java NIO 和 AIO 总结 date: 2023-05-10 13:21:26 tags: NIOAIO categories:开发知识及其他 cover: https://cover.png feature: false 1. NIO Java NIO (New IO) is an alternative IO API for Java, meaning alternative to the standard Java IO and Java Networkin…