在第 5 章 基础服务端开发中,我们学习了如何编写模型方法来实现模块的逻辑。然而,当我们遇到错误或逻辑问题时,可能会陷入困境。为了解决这些错误,我们需要进行详细的检查,这可能需要时间。幸运的是,Odoo 为您提供了一些调试工具,可以帮助您找到各种问题的根本原因。在本章中,我们将详细了解各种调试工具和技术。
在本章中,我们将涵盖以下内容:
-
自动重载和
--dev选项 -
生成服务器日志以帮助调试方法
-
使用 Odoo shell 交互式地调用方法
-
使用 Python 调试器 跟踪方法执行
-
理解调试模式选项
自动重载和 --dev 选项
在前面的章节中,我们看到了如何添加模型、字段和视图。每当我们对 Python 文件进行更改时,都需要重启服务器才能应用这些更改。如果我们在 XML 文件中进行更改,则需要重启服务器并更新模块才能在用户界面中反映这些更改。如果您正在开发一个大型应用程序,这可能会非常耗时且令人沮丧。Odoo 提供了一个命令行选项 --dev 来克服这些问题。--dev 选项有几种可能的值,在本节中我们将查看其中的每一个。
准备工作
在您的开发环境中,使用以下 shell 命令安装 inotify 或 watchdog。如果没有 inotify 或 watchdog,自动重载功能将无法工作:
|
1 2 |
$ pip3 install inotify $ pip3 install watchdog |
如何实现…
要启用 dev 选项,您需要从命令行使用 --dev=value。此选项的可能值包括 all、reload、pudb|wdb|ipdb|pdb、qweb、werkzeug 和 xml。请查看以下内容以获取更多信息。
工作原理…
查看以下列表,了解所有 --dev 选项及其用途:
-
reload:每当您在 Python 中进行更改时,都需要重启服务器才能在 Odoo 中反映这些更改。
--dev=reload选项会在您更改任何 Python 文件时自动重载 Odoo 服务器。如果您没有安装 Pythoninotify包,此功能将不起作用。当您使用此选项运行 Odoo 服务器时,您会看到如下日志:AutoReload watcher running with inotify。 -
qweb:您可以使用 QWeb 模板在 Odoo 中创建动态网站页面。在**第 14 章《CMS 网站开发》**中,我们将看到如何使用 QWeb 模板开发网页。您可以使用
t-debug属性调试 QWeb 模板中的问题。t-debug选项仅在您使用--dev=qweb启用 dev 模式时才有效。 -
werkzeug:Odoo 使用 werkzeug 来处理 HTTP 请求。在内部,Odoo 会捕获并抑制 werkzeug 生成的所有异常。如果您使用
--dev=werkzeug,当生成异常时,werkzeug 的交互式调试器将显示在网页上。 -
xml:每当您更改视图结构时,都需要重新加载服务器并更新模块才能应用这些更改。使用
--dev=xml选项,您只需从浏览器重新加载 Odoo 即可。无需重启服务器或更新模块。 -
pudb|wdb|ipdb|pdb:您可以使用 Python 调试器 (PDB) 来获取有关错误的更多信息。当您使用
--dev=pdb选项时,它会在 Odoo 中生成异常时激活 PDB。Odoo 支持四种 Python 调试器:pudb、wdb、ipdb和pdb。 -
all:如果您使用
--dev=all,则所有前面的选项都将启用。
|
1 |
$ odoo/odoo-bin -c ~/odoo-dev/my-instance.cfg --dev=all |
如果您只想启用少数选项,可以使用逗号分隔的值,如下所示:
|
1 |
$ odoo/odoo-bin -c ~/odoo-dev/my-instance.cfg --dev=reload,qweb |
重要提示
如果您对数据库结构进行了更改,例如添加了新字段,
--dev=reload选项将不会在数据库模式中反映这些更改。您需要手动更新模块;它仅适用于 Python 业务逻辑。如果您添加了新视图或菜单,--dev=xml选项将不会在用户界面中反映这些更改。您需要手动更新模块。当您设计视图或网站页面的结构时,这非常有用。如果用户从 GUI 更改了视图,则--dev=xml将不会从文件中加载 XML。Odoo 将使用用户更改的视图结构。
生成服务器日志以帮助调试方法
服务器日志对于查明崩溃前运行时发生了什么非常有用。在调试出现问题时,也可以添加日志以提供额外信息。本节向您展示如何向现有方法添加日志记录。
准备工作
我们将向以下方法添加一些日志记录语句,该方法将产品库存水平保存到文件中(您还需要向 manifest 添加 product 和 stock 模块的依赖项):
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
from os.path import join as opj from odoo import models, api, exceptions EXPORTS_DIR = '/srv/exports' class ProductProduct(models.Model): _inherit = 'product.product' @api.model def export_stock_level(self, stock_location): products = self.with_context( location=stock_location.id ).search([]) products = products.filtered('qty_available') fname = opj(EXPORTS_DIR, 'stock_level.txt') try: with open(fname, 'w') as fobj: for prod in products: fobj.write('%s\t%f\n' % (prod.name, prod.qty_available)) except IOError: raise exceptions.UserError('unable to save file') |
如何实现…
为了在执行此方法时获取一些日志,请执行以下步骤:
-
在代码开头导入
logging模块:1import logging -
在模型类定义之前,获取模块的日志记录器:
1_logger = logging.getLogger(__name__) -
修改
export_stock_level()方法的代码,如下所示:123456789101112131415161718@api.modeldef export_stock_level(self, stock_location):_logger.info('export stock level for %s', stock_location.name)products = self.with_context(location=stock_location.id).search([])products = products.filtered('qty_available')_logger.debug('%d products in the location', len(products))fname = join(EXPORTS_DIR, 'stock_level.txt')try:with open(fname, 'w') as fobj:for prod in products:fobj.write('%s\t%f\n' % (prod.name, prod.qty_available))except IOError:_logger.exception('Error while writing to %s in %s','stock_level.txt', EXPORTS_DIR)raise exceptions.UserError('unable to save file')
工作原理…
步骤 1 从 Python 标准库导入 logging 模块。Odoo 使用此模块来管理其日志。
步骤 2 为 Python 模块设置日志记录器。我们在 Odoo 中使用惯用语 __name__ 作为日志记录器名称的自动变量,并将其命名为 _logger。
重要提示
__name__变量由 Python 解释器在模块导入时自动设置,其值是模块的完整名称。由于 Odoo 对导入做了一些处理,附加模块被 Python 视为属于odoo.addonsPython 包。因此,如果代码位于my_hostel/models/hostel.py中,__name__将是odoo.addons.my_hostel.models.hostel。
这样做,我们获得了两个好处:
-
因为
logging模块中日志记录器的层次结构,应用于odoo日志记录器的全局日志记录配置将应用于我们的日志记录器。 -
日志将以完整的模块路径为前缀,这对于查找给定日志行在哪里生成非常有帮助。
步骤 3 使用日志记录器生成日志消息。可用的方法(按日志级别递增)有 debug、info、warning、error 和 critical。所有这些方法都接受一条消息,您可以在其中使用 % 替换以及要插入到消息中的附加参数。您无需自己处理 % 替换;如果必须生成日志,logging 模块会足够智能地执行此操作。如果您以 INFO 日志级别运行,那么 DEBUG 日志将避免替换,从长远来看,这会消耗 CPU 资源。
本节中展示的另一个有用方法是 _logger.exception(),它可以在异常处理程序中使用。该消息将以 ERROR 级别记录,并且堆栈跟踪也会打印在应用程序日志中。
更多内容…
您可以从命令行或从配置文件中控制应用程序的日志记录级别。有两种主要方法可以做到这一点:
第一种方法是使用 --log-handler 选项。它的基本语法如下:--log-handler=prefix:level。在这种情况下,prefix 是日志记录器名称路径的一部分,level 是 DEBUG、INFO、WARNING、ERROR 或 CRITICAL。如果您省略前缀,则设置所有日志记录器的默认级别。例如,要将 my_hostel 日志记录器的日志记录级别设置为 DEBUG 并保持其他附加组件的默认日志级别,您可以按如下方式启动 Odoo:
|
1 |
$ python odoo.py --log-handler=odoo.addons.my_hostel:DEBUG |
可以在命令行上多次指定 --log-handler。您也可以在 Odoo 实例的配置文件中配置日志处理程序。在这种情况下,您可以使用逗号分隔的 prefix:level 对列表。例如,以下行与之前的最小日志输出配置相同。我们默认保留最重要的消息和错误消息,但 werkzeug 生成的消息除外,我们只需要关键消息,以及 odoo.service.server,我们保留信息级别消息,包括服务器启动通知:
|
1 |
log_handler = :ERROR,werkzeug:CRITICAL,odoo.service.server:INFO第二种方法是使用 <code style="font-size: 14px;">--log-level</code><span style="background-color: #ffffff; font-family: 'microsoft yahei'; font-size: 14px;"> 选项。要全局控制日志级别,可以使用 </span><code style="font-size: 14px;">--log-level</code><span style="background-color: #ffffff; font-family: 'microsoft yahei'; font-size: 14px;"> 作为命令行选项。此选项的可能值包括 </span><code style="font-size: 14px;">critical</code><span style="background-color: #ffffff; font-family: 'microsoft yahei'; font-size: 14px;">、</span><code style="font-size: 14px;">error</code><span style="background-color: #ffffff; font-family: 'microsoft yahei'; font-size: 14px;">、</span><code style="font-size: 14px;">warn</code><span style="background-color: #ffffff; font-family: 'microsoft yahei'; font-size: 14px;">、</span><code style="font-size: 14px;">debug</code><span style="background-color: #ffffff; font-family: 'microsoft yahei'; font-size: 14px;">、</span><code style="font-size: 14px;">debug_rpc</code><span style="background-color: #ffffff; font-family: 'microsoft yahei'; font-size: 14px;">、</span><code style="font-size: 14px;">debug_rpc_answer</code><span style="background-color: #ffffff; font-family: 'microsoft yahei'; font-size: 14px;">、</span><code style="font-size: 14px;">debug_sql</code><span style="background-color: #ffffff; font-family: 'microsoft yahei'; font-size: 14px;"> 和 </span><code style="font-size: 14px;">test</code><span style="background-color: #ffffff; font-family: 'microsoft yahei'; font-size: 14px;">。</span> |
有一些设置日志级别的快捷方式。以下是其中的列表:
-
--log-request是--log-handler=odoo.http.rpc.request:DEBUG的快捷方式 -
--log-response是--log-handler=odoo.http.rpc.response:DEBUG的快捷方式 -
--log-web是--log-handler=odoo.http:DEBUG的快捷方式 -
--log-sql是--log-handler=odoo.sql_db:DEBUG的快捷方式
使用 Odoo shell 交互式地调用方法
Odoo Web 界面主要面向最终用户,尽管开发者模式解锁了许多强大的功能。然而,通过 Web 界面进行测试和调试并不是最简单的方法,因为您需要手动准备数据、在菜单中导航以执行操作等等。Odoo shell 是一个命令行界面,您可以使用它来发出调用。本节向您展示如何启动 Odoo shell 并执行操作,例如在 shell 中调用方法。
准备工作
我们将重用上一节中用于生成服务器日志以帮助调试方法的相同代码。这允许 product.product 模型添加一个新方法。我们假设您有一个已安装并可用的附加组件实例。在本节中,我们期望您有一个名为 project.conf 的 Odoo 配置文件用于此实例。
如何实现…
为了从 Odoo shell 调用 export_stock_level() 方法,请执行以下步骤:
-
启动 Odoo shell 并指定您的项目配置文件:
1<strong class="bold">$ ./odoo-bin shell -c project.conf --log-level=error</strong> -
检查错误消息并阅读在通常的 Python 命令行提示符之前显示的信息文本:
1234567<strong class="bold">env: <odoo.api.Environment object at 0x7f48cc0868c0></strong><strong class="bold">odoo: <module 'odoo' from '/home/serpentcs/workspace/17.0/odoo/__init__.py'></strong><strong class="bold">openerp: <module 'odoo' from '/home/serpentcs/workspace/17.0/odoo/__init__.py'></strong><strong class="bold">self: res.users(1,)</strong><strong class="bold">Python 3.10.13 (main, Aug 25 2023, 13:20:03) [GCC 9.4.0]</strong><strong class="bold">Type 'copyright', 'credits' or 'license' for more information</strong><strong class="bold">IPython 7.13.0 -- An enhanced Interactive Python. Type '?' for help.</strong> -
获取
product.product的记录集:1>>> product = env['product.product'] -
获取主库存位置记录:
1>>> location_stock = env.ref('stock.stock_location_stock') -
调用
export_stock_level()方法:1>>> product.export_stock_level(location_stock) -
在退出前提交事务:
1>>> env.cr.commit() -
按 Ctrl + D 退出 shell。
工作原理…
步骤 1 使用 odoo-bin shell 启动 Odoo shell。所有常用的命令行参数都可用。我们使用 -c 来指定项目配置文件,并使用 --log-level 来降低日志的冗长程度。调试时,您可能希望将某些特定的附加组件的日志记录级别设置为 DEBUG。
在为您提供 Python 命令行提示符之前,odoo-bin shell 会启动一个不侦听网络的 Odoo 实例,并初始化一些在输出中提到的全局变量:
-
env是一个连接到数据库并在命令行或配置文件中指定的环境。 -
odoo是为您导入的odoo包。您可以访问该包中的所有 Python 模块来执行您想要的操作。 -
openerp是odoo包的别名,用于向后兼容。 -
self是res.users的记录集,其中包含 Odoo 超级用户(管理员)的单个记录,该记录与env环境链接。
步骤 3 和 4 使用 env 获取一个空记录集并根据 XML ID 查找记录。步骤 5 在 product.product 记录集上调用方法。这些操作与您在方法内部使用的操作相同,细微差别在于我们使用 env 而不是 self.env(尽管两者都可以,因为它们是相同的)。请参阅**第 5 章《基础服务端开发》**以获取有关可用内容的更多信息。
步骤 6 提交数据库事务。在这里这不是严格必要的,因为我们没有修改数据库中的任何记录,但是如果我们这样做了并希望这些更改持久化,这是必要的;当您通过 Web 界面使用 Odoo 时,每个 RPC 调用都在其自己的数据库事务中运行,Odoo 会为您管理这些事务。在 shell 模式下运行时,情况不再如此,您必须自己调用 env.cr.commit() 或 env.cr.rollback()。否则,当您退出 shell 时,任何正在进行的事务都会自动回滚。测试时,这没问题,但如果您使用 shell(例如,编写实例配置脚本),请不要忘记提交您的工作!
更多内容…
在 shell 模式下,默认情况下,Odoo 打开 Python 的 REPL shell 界面。您可以使用 --shell-interface 选项使用您选择的 REPL。支持的 REPL 是 ipython、ptpython、bpython 和 python:
|
1 |
$ ./odoo-bin shell -c project.conf --shell-interface=ptpython |
使用 Python 调试器跟踪方法执行
有时,应用程序日志不足以查明出了什么问题。幸运的是,我们还有 Python 调试器。本节向我们展示了如何在方法中插入断点并手动跟踪执行。
准备工作
我们将重用本章**《使用 Odoo shell 交互式地调用方法》**一节中显示的 export_stock_level() 方法。确保您手头有它的副本。
如何实现…
要使用 pdb 跟踪 export_stock_level() 的执行,请执行以下步骤:
- 编辑方法的代码,并插入此处突出显示的行:
12345678910def export_stock_level(self, stock_location):import pdb; pdb.set_trace()products = self.with_context( location=stock_location.id ).search([])fname = join(EXPORTS_DIR, 'stock_level.txt')try:with open(fname, 'w') as fobj:for prod in products.filtered('qty_available'):fobj.write('%s\t%f\n' % (prod.name, prod.qty_available))except IOError:raise exceptions.UserError('unable to save file') -
运行该方法。我们将使用 Odoo shell,如使用 Odoo shell 交互式地调用方法一节中所述:
12345678$ ./odoo-bin shell -c project.cfg --log-level=error[...]>>> product = env['product.product']>>> location_stock = env.ref('stock.stock_location_stock')>>> product.export_stock_level(location_stock)> /home/cookbook/stock_level/models.py(18)export_stock_level()-> products = self.with_context((Pdb) -
在
(Pdb)提示符下,发出args命令(快捷方式为a)以获取传递给方法的参数值:123(Pdb) aself = product.product()stock_location = stock.location(14,) -
输入
list命令以检查您所处的位置:12345678910111213(Pdb) list13 @api.model14 def export_stock_level(self, stock_location):15 _logger.info('export stock level for %s',16 stock_location.name)17 import pdb; pdb.set_trace()18 -> products = self.with_context(19 location=stock_location.id).search([])20 products = products.filtered('qty_available')21 _logger.debug('%d products in the location',22 len(products))23 fname = join(EXPORTS_DIR, 'stock_level.txt')(Pdb) -
输入
next命令三次,以遍历方法的前几行。您也可以使用快捷方式n:123456789101112131415161718(Pdb) next> /home/cookbook/stock_level/models.py(19)export_stock_level()-> location=stock_location.id).search([])(Pdb) n> /home/cookbook/stock_level/models.py(20)export_stock_level()-> products = products.filtered('qty_available')(Pdb) n> /home/cookbook/stock_level/models.py(21)export_stock_level()-> _logger.debug('%d products in the location',(Pdb) n> /home/cookbook/stock_level/models.py(22)export_stock_level()-> len(products))(Pdb) n> /home/cookbook/stock_level/models.py(23)export_stock_level()-> fname = join(EXPORTS_DIR, 'stock_level.txt')(Pdb) n> /home/cookbook/stock_level/models.py(24)export_stock_level()-> try: -
使用
p命令显示products和fname变量的值:1234(Pdb) p productsproduct.product(32, 14, 17, 19, 21, 22, 23, 29, 34, 33, 26, 27, 42)(Pdb) p fname'/srv/exports/stock_level.txt' -
更改
fname的值以指向/tmp目录:1(Pdb) !fname = '/tmp/stock_level.txt' -
使用
return命令(快捷方式:r)执行当前函数:1234(Pdb) return--Return--> /home/cookbook/stock_level/models.py(26)export_stock_level()->None-> for product in products: -
使用
cont命令(快捷方式:c)恢复程序执行:12(Pdb) c>>>
工作原理…
在步骤 1 中,我们通过调用 Python 标准库中 pdb 模块的 set_trace() 方法,在方法的源代码中硬编码了一个断点。当执行此方法时,程序的正常流程停止,您会获得一个 (Pdb) 提示符,您可以在其中输入 pdb 命令。
步骤 2 使用 shell 模式调用 stock_level_export() 方法。也可以正常重启服务器并使用 Web 界面生成对您需要跟踪的方法的调用,方法是单击用户界面上的相应元素。
当您需要使用 Python 调试器手动单步执行某些代码时,这里有一些技巧可以让您的生活更轻松:
-
降低日志记录级别,以避免日志行过多,从而污染调试器的输出。从 ERROR 级别开始通常是好的。您可能希望使用更高的详细程度启用某些特定的日志记录器,您可以使用
--log-handler命令行选项来实现(请参阅**《生成服务器日志以帮助调试方法》**一节)。 -
使用
--workers=0运行服务器,以避免任何多进程问题,这可能会导致在两个不同的进程中两次达到相同的断点。 -
使用
--max-cron-threads=0运行服务器,以禁用ir.cron周期性任务的处理,否则当您单步执行方法时可能会触发这些任务,从而产生不需要的日志和副作用。
步骤 3 到 8 使用几个 pdb 命令来单步执行方法的执行。以下是 pdb 的主要命令摘要。其中大多数也可以使用首字母作为快捷方式。我们在以下列表中用括号中的可选字母表示:
-
h(elp):显示pdb命令的帮助。 -
a(rgs):显示当前函数/方法的参数值。 -
l(ist):以 11 行的块显示正在执行的源代码,最初以当前行为中心。连续调用将在源代码文件中进一步移动。或者,您可以传递开始和结束的两个整数,指定要显示的区域。 -
p:打印变量。 -
pp:漂亮地打印变量(对列表和字典很有用)。 -
w(here):显示调用堆栈,当前行在底部,Python 解释器在顶部。 -
u(p):在调用堆栈中向上移动一级。 -
d(own):在调用堆栈中向下移动一级。 -
n(ext):执行当前代码行,然后停止。 -
s(tep):单步进入方法调用的执行。 -
r(eturn):恢复当前方法的执行,直到它返回。 -
c(ont(inue)):恢复程序执行,直到遇到下一个断点。 -
b(reak) <args>:创建新断点并显示其标识符;args可以是以下之一:-
<empty>:列出所有断点。 -
line_number:在当前文件中的指定行处中断。 -
filename:line_number:在指定文件(在sys.path的目录中搜索)的指定行处中断。 -
function_name:在指定函数的第一行中断。
-
-
tbreak <args>:类似于break,但断点在达到后将被取消,因此该行的连续执行不会两次触发它。 -
disable bp_id:按 ID 禁用断点。 -
enable bl_id:按 ID 启用禁用的断点。 -
j(ump) lineno:下一行将是指定的行。这可用于重新运行或跳过某些行。 -
(!)语句:执行 Python 语句。如果该命令看起来不像pdb命令,则可以省略!字符。例如,如果您想设置名为a的变量的值,则需要它,因为a是args命令的快捷方式。
更多内容…
在本节中,我们插入了 pdb.set_trace() 语句以中断到 pdb 进行调试。我们也可以使用 pdb.runcall() 直接从 Odoo shell 中启动 pdb,当您无法轻松修改项目的代码时,这非常有用。此函数将方法作为第一个参数,将要传递给函数的参数作为下一个参数。因此,在 Odoo shell 中,您执行以下操作:
|
1 2 3 4 5 6 |
>>> import pdb >>> product = env['product.product'] >>> location_stock = env.ref('stock.stock_location_stock') >>> pdb.runcall(product.export_stock_level, location_stock) > /home/cookbook/stock_level/models.py(16)export_stock_level() -> products = self.with_context((Pdb) |
在本节中,我们重点介绍了 Python 标准库中的 Python 调试器 pdb。了解此工具非常有用,因为它保证在任何 Python 发行版上都可用。还有其他可用的 Python 调试器,例如 ipdb (https://pypi.python.org/pypi/ipdb) 和 pudb (https://pypi.python.org/pypi/pudb),它们可以用作 pdb 的直接替代品。它们共享相同的 API,并且您在本节中看到的大多数命令都保持不变。当然,如果您使用 Python IDE 进行 Odoo 开发,您将可以访问与其集成的调试器。
另请参阅
如果您想了解有关 pdb 调试器的更多信息,请参阅 pdb 的完整文档:https://docs.python.org/3.9/library/pdb.html。
理解调试模式选项
在第 1 章 安装 Odoo 开发环境中,我们看到了如何在 Odoo 中启用调试/开发者选项。这些选项在调试和揭示一些进一步的技术信息方面非常有帮助。在本节中,我们将详细了解这些选项。
如何实现…
查看第 1 章 安装 Odoo 开发环境中的激活 Odoo 开发者工具一节,并激活开发者模式。激活开发者模式后,您将在顶部栏中看到一个带有错误图标的下拉菜单,如下图所示:
图7.1:开启调试模式之后的选项
在此菜单中,您将看到各种选项。尝试使用它们以查看它们的实际效果。下一节将更详细地解释这些选项。
工作原理…
让我们通过以下几点了解有关这些选项的更多信息:
-
Run JS Tests (运行 JS 测试):此选项将把您重定向到 JavaScript QUnit 测试用例页面,如下图所示。它将开始一个接一个地运行所有测试用例。在这里,您可以看到测试用例的进度和状态。在第 18 章 自动化测试用例中,我们将看到如何创建我们自己的 QUnit JavaScript 测试用例:
图7.2:QUnit测试用例结果页 -
Run JS Mobile Tests (运行 JS 移动端测试):与上一个选项类似,但此选项运行移动环境的 QUnit 测试用例。
-
Run Click Anywhere Tests (运行点击任意位置测试):此选项将开始一个接一个地单击所有菜单。它将单击所有视图和搜索过滤器。如果出现问题或有任何回归,它将显示回溯。要停止此测试,您需要重新加载页面。
-
Open View (打开视图):此选项将打开所有可用视图的列表。通过选择其中任何一个,您可以打开该视图,而无需定义任何菜单或操作。
-
Disable Tours (禁用导览):Odoo 使用导览 (tours) 来改进新用户的入门。如果您想禁用它,可以使用此选项。
-
Start Tour (开始导览):Odoo 也使用导览进行自动化测试。我们将在第 15 章《Web 客户端开发中创建一个自定义入门导览。此选项将打开一个对话框,其中包含所有导览的列表,如下图所示。通过单击导览旁边的播放按钮,Odoo 将自动执行导览的所有步骤:
图7.3:开启导览对话框 -
Edit Action (编辑动作):在第 3 章 创建 Odoo 插件模块的添加菜单项和视图一节中,我们添加了一个菜单项和一个用于在 Odoo 中打开视图的动作。这些动作的详细信息也作为记录存储在数据库中。此选项将打开我们打开以显示当前视图的动作的记录详细信息。
-
View Fields (查看字段):当您想从用户界面查看字段的详细信息时,将使用此选项。它将显示当前模型的字段列表。例如,如果您打开
hostel.hostel模型的树视图或表单视图,此选项将显示hostel.hostel模型的字段列表。 -
Manage Filters (管理过滤器):在 Odoo 中,用户可以从搜索视图创建自定义过滤器。此选项将打开当前模型的自定义过滤器列表。在这里,您可以修改自定义过滤器。
-
Technical Translations (技术翻译):此选项将打开当前模型的翻译术语列表。您可以从此处修改模型的技术翻译术语。您可以参考第 11 章 国际化了解有关翻译的更多信息。
-
View Access Rights (查看访问权限):此选项将显示当前模型的安全访问权限列表。
-
View Record Rules (查看记录规则):此选项将显示当前模型的安全记录规则列表。
-
Fields View Get (字段视图获取):您可以从其他附加模块扩展和修改现有视图。在某些应用程序中,这些视图由多个附加模块继承。正因为如此,很难清楚地了解整个视图定义。使用此选项,您将在应用所有视图继承后获得最终的视图定义。在内部,它使用
fields_view_get()方法。 -
Edit View: <view type> (编辑视图: <视图类型>):此选项将打开当前视图的
ir.ui.view记录对话框。此选项是动态的,它将根据当前打开的视图显示选项。这意味着如果您打开 Kanban View (看板视图),您将获得 Edit View: Kanban 选项,如果您打开 Form View (表单视图),您将获得 Edit View: Form 选项。
重要提示
您可以从 Edit View 选项修改视图定义。此更新的定义将适用于当前数据库,当您更新模块时,这些更改将被删除。因此,最好从模块中修改视图。
-
Edit ControlPanelView (编辑控制面板视图):此选项与前一个选项相同,但它将打开当前模型的搜索视图的
ir.ui.view记录。 -
Activate Assets Debugging (激活资源调试):Odoo 提供两种类型的开发者模式:Developer mode (开发者模式) 和 Developer mode with assets (带资源的开发者模式)。使用此选项,您可以从 Developer mode 切换到 Developer mode with assets 模式。请查看第 1 章 安装 Odoo 开发环境中的激活 Odoo 开发者工具一节了解更多详细信息。
-
Activate Test Assets Debugging (激活测试资源调试):如我们所知,Odoo 使用导览进行测试。启用此模式将在 Odoo 中加载测试资源。此选项将在 Start tour (开始导览) 对话框中显示更多导览。
-
Regenerate Assets Bundles (重新生成资源包):Odoo 通过资源包管理所有 CSS 和 JavaScript。此选项会删除旧的 JavaScript 和 CSS 资源并生成新的资源。当您遇到资源缓存问题时,此选项非常有用。我们将在第 14 章 CMS 网站开发*中了解有关资源包的更多信息。
-
Become Super User (成为超级用户):这是从版本 12 开始添加的新选项。通过激活此选项,您将切换到超级用户。即使您没有访问权限,也可以访问记录。此选项并非适用于所有用户;它仅适用于具有 Administration: settings (管理: 设置) 访问权限的用户。激活此模式后,您将看到一个带有条纹的顶部菜单,如下图所示:
图7.4:启用超级用户之后的菜单 -
Leave Developer Tools (离开开发者工具):此选项允许您离开开发者模式。
我们已经了解了调试菜单下的所有可用选项。这些选项可以用于多种方式,例如调试、测试和修复问题。它们也可以用于探索视图的源代码。






