我想在此表单中添加一些其他字段,可以从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格式,因此我无法继承和修改任何模板:
<!-- 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">×</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
模块来更改所有这些行为?
答案 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模块中复制并粘贴该方法。