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

时间:2019-05-28 07:48:48

标签: python html odoo odoo-11 database-management

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

enter image description here

数据发送到此控制器:

@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格式,因此我无法继承和修改任何模板:

<!-- Duplicate DB -->
<div class="modal fade o_database_duplicate" role="dialog">
    <div class="modal-dialog">
        <div class="modal-content">
        <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
        <h4 class="modal-title">Duplicate Database</h4>
        </div>
        <form id="form-duplicate-db" role="form" action="/web/database/duplicate" method="post">
            <div class="modal-body">
            {{ master_input() }}
            <div class="form-group">
                <label for="name" class="control-label">Database Name</label>
                <input id="name" type="text" name="name" class="form-control" required="required" readonly="readonly"/>
            </div>
            <div class="form-group">
                <label for="new_name" class="control-label">New Name</label>
                <input id="new_name" type="text" name="new_name" class="form-control" required="required" pattern="{{ pattern }}" title="Only alphanumerical characters, underscore, hyphen and dot are allowed"/>
            </div>
            </div>
            <div class="modal-footer">
            <input type="submit" value="Continue" class="btn btn-primary pull-right"/>
            </div>
        </form>
        </div>
    </div>
</div>

我找到了呈现此html的python代码

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模块来更改所有这些行为?

2 个答案:

答案 0 :(得分:0)

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

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

  getSubdomain() {
    const domain = window.location.hostname;
    if (domain.indexOf('.') < 0 
       || domain.split('.')[0] === 'example' 
       || domain.split('.')[0] === 'lvh' 
       || domain.split('.')[0] === 'www') {
       this.subdomain = '';
    } else {
       this.subdomain = domain.split('.')[0];
    }
    console.log('subdomain', this.subdomain);
  }

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

答案 1 :(得分:0)

是的,您需要覆盖Web模块的_render_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):

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)

这是v10中的示例。您可以从正在使用的版本的Odoo模块中复制并粘贴该方法。