技术Odoo
在Odoo中,控制器用于设计前端模块。这些前端模块与后端模块连接。重写是类的属性,用于更改其基类之一提供的性能。它用于在编程逻辑中有所不同。我们可以在Odoo中覆盖一个活动的控制器。
要使用控制器,首先必须在模块中创建一个文件夹控制器,将此文件夹添加到初始化文件中。我们应该添加一个python文件,该文件是初始化文件和其他文件,用于定义控制器方法及其属性。模块结构如下图所示
若要重写控制器,必须创建一个子类来定义现有函数。现在,从控制器中选择一个函数,以便从插件中覆盖。
为了更好地理解,我选择了以下轮播最近查看的功能进行覆盖。
def_get_products_recently_viewed(self):"""
Returns list of recently viewed products according to current user
"""max_number_of_product_for_carousel =12visitor = request.env[website.visitor]._get_visitor_from_request()ifvisitor:
excluded_products = request.website.sale_get_order().mapped(order_line.product_id.id)
products = request.env[website.track].sudo().read_group(
[(visitor_id,=, visitor.id), (product_id,!=,False), (product_id.website_published,=,True), (product_id,not in, excluded_products)],
[product_id,visit_datetime:max], [product_id], limit=max_number_of_product_for_carousel, orderby=visit_datetime DESC)
products_ids = [product[product_id][0]forproductinproducts]ifproducts_ids:
viewed_products = request.env[product.product].with_context(display_default_code=False).browse(products_ids)
FieldMonetary = request.env[ir.qweb.field.monetary]
monetary_options = {display_currency: request.website.get_current_pricelist().currency_id,
}
rating = request.website.viewref(website_sale.product_comment).active
res = {products: []}forproductinviewed_products:
combination_info = product._get_combination_info_variant()
res_product = product.read([id,name,website_url])[0]
res_product.update(combination_info)
res_product[price] = FieldMonetary.value_to_html(res_product[price], monetary_options)ifrating:
res_product[rating] = request.env["ir.ui.view"]._render_template(portal_rating.rating_widget_stars_static, values={rating_avg: product.rating_avg,rating_count: product.rating_count,
})
res[products].append(res_product)returnresreturn{}
所以首先,我们需要从库中导入它
fromodoo.addons.website_sale.controllers.mainimportWebsiteSalefromodoo.httpimportrequest
现在我们需要将此函数粘贴到我们的子类中,您可以在其中进行所需的更改。目前内部功能,转盘中显示的产品数量最多为12个。我们将它更改为 10,如下所示。
如果您现在查看网站,则轮播中只能看到10种产品,如下图所示。
在覆盖控制器时,我们应该考虑以下事项。
* 我们有两种方法可以覆盖 odoo 中的现有控制器。
- 函数替换:我们可以选择一个控制器或函数并将其粘贴到我们的子类中,现在您可以在其中进行所需的更改
- 超级函数:超级函数用于返回父类的方法和属性。
* 我们需要导入如下所示的控制器类。
fromodoo.addons.website_sale.controllers.mainimportWebsiteSale
*如果我们必须获取值或修改它们,通过渲染模板,我们可以使用qcontext或**kwargs获取它。Q上下文有助于获取从原始控制器返回的值,如果需要,我们可以修改该值。
* 有时,如果您希望覆盖具有路由的控制器,则可能会导致问题。因此,我们将不得不在子类中指定路由,然后您可以在其中进行更改。
例如
因此,在上面的示例中,我们已经考虑了上面讨论的覆盖控制器的所有要点。在这里,我们使用 Q 上下文更改了产品的名称。
特别声明:文章来源用户上传并发布,本站只提供信息存储服务,不拥有所有权,内容仅供参考。