Python 如何在数据库管理器中修改重复表单?

Python 如何在数据库管理器中修改重复表单?,python,html,odoo,odoo-11,database-management,Python,Html,Odoo,Odoo 11,Database Management,我想在此表单中添加一些其他字段,这些字段可以从Odoo中的数据库管理器访问 将数据发送到此控制器: @http.route('/web/database/duplicate', type='http', auth="none", methods=['POST'], csrf=False) def duplicate(self, master_pwd, name, new_name): try: if not re.match(DBNAME_PATTERN, new_na

我想在此表单中添加一些其他字段,这些字段可以从Odoo中的数据库管理器访问

将数据发送到此控制器:

@http.route('/web/database/duplicate', type='http', auth="none", methods=['POST'], csrf=False)
def duplicate(self, master_pwd, name, new_name):
    try:
        if not re.match(DBNAME_PATTERN, new_name):
            raise Exception(_('Invalid database name. Only alphanumerical characters, underscore, hyphen and dot are allowed.'))
        dispatch_rpc('db', 'duplicate_database', [master_pwd, name, new_name])
        return http.local_redirect('/web/database/manager')
    except Exception as e:
        error = "Database duplication error: %s" % (str(e) or repr(e))
        return self._render_template(error=error)
但是表单是纯html,因此我无法继承和修改任何模板:


&时代;
副本数据库
{{master_input()}}
数据库名称
新名称
我发现了一个python代码,其中呈现了这个html

class Database(http.Controller):

    def _render_template(self, **d):
        d.setdefault('manage',True)
        d['insecure'] = odoo.tools.config.verify_admin_password('admin')
        d['list_db'] = odoo.tools.config['list_db']
        d['langs'] = odoo.service.db.exp_list_lang()
        d['countries'] = odoo.service.db.exp_list_countries()
        d['pattern'] = DBNAME_PATTERN
        # databases list
        d['databases'] = []
        try:
            d['databases'] = http.db_list()
            d['incompatible_databases'] = odoo.service.db.list_db_incompatible(d['databases'])
        except odoo.exceptions.AccessDenied:
            monodb = db_monodb()
            if monodb:
                d['databases'] = [monodb]
        return env.get_template("database_manager.html").render(d)
我是否应该修改此代码以使用其他模板?还是有其他更合适的解决方案


直接在web模块中修改原始代码是实现这一点的唯一方法吗?有没有办法通过继承
web
模块来改变所有这些行为?

当然,您可以通过自定义模块来完成。首先,您必须根据需要定义自己的html模板,然后必须重写呈现html文件的控制器

您可以参考以下代码来重写控制器

from odoo.addons.web.controllers.main import Database  # importing base controller class

class MyDatabase(Database):
    def _render_template(self, **d):
       d.setdefault('manage',True)
       d['insecure'] = odoo.tools.config.verify_admin_password('admin')
       d['list_db'] = odoo.tools.config['list_db']
       d['langs'] = odoo.service.db.exp_list_lang()
       d['countries'] = odoo.service.db.exp_list_countries()
       d['pattern'] = DBNAME_PATTERN
       #additional parameters if any
       d['databases'] = []
       try:
           d['databases'] = http.db_list()
           d['incompatible_databases'] = odoo.service.db.list_db_incompatible(d['databases'])
       except odoo.exceptions.AccessDenied:
           monodb = db_monodb()
           if monodb:
               d['databases'] = [monodb]

       return env.get_template("your_modified_template.html").render(d)  #render your modified html template.

如果您有任何疑问,请查看模块的代码。

是的,您需要覆盖web模块的
\u render\u template
方法。 您还需要为此创建自己的HTML模板,并将其传递给渲染

from odoo.addons.web.controllers.main import db_monodb, Database as DB, env
import jinja2

loader = jinja2.PackageLoader('odoo.addons.your_custom_module_name', "views")
env = jinja2.Environment(loader=loader, autoescape=True)
env.filters["json"] = json.dumps
类数据库(DB):


这是v10中的一个示例。您只需从正在处理的版本的Odoo模块中复制并粘贴该方法。

至少它正在控制器中调用/呈现模板。因此,您可以尝试编写自己的html页面,并将其作为模板而不是原始模板加载。并且可以在不更改原始代码的情况下重写控制器。顺便说一句,谢谢,我从来没有研究过这个问题,现在我想知道为什么这个页面不是用QWeb模板编写的。@ChesuCR看看这个应用程序10.0版不稳定,但你会有一个想法的。问题是有些代码可以正常继承,而有些方法需要对它们进行修补。
def _render_template(self, **d):
    d.setdefault('manage',True)
    d['insecure'] = odoo.tools.config['admin_passwd'] == 'admin'
    d['list_db'] = odoo.tools.config['list_db']
    d['langs'] = odoo.service.db.exp_list_lang()
    d['countries'] = odoo.service.db.exp_list_countries()
    d['pattern'] = DBNAME_PATTERN
        # databases list
        d['databases'] = []
        try:
            d['databases'] = http.db_list()
        except odoo.exceptions.AccessDenied:
            monodb = db_monodb()
            if monodb:
                d['databases'] = [monodb]
        return env.get_template("your_html_template_file_name.html").render(d)