【发布时间】:2020-06-26 12:20:20
【问题描述】:
我可以创建一个获取模型名称作为参数并呈现模型的表单视图的小部件吗?
我的期望是这样的:
- 当用户单击菜单时,模型表单以编辑模式显示 ('mymodule.asset_category')。
- 然后用户选择一个类别下拉列表。例如“资产”。 ('Asset'asset_category 的 'related_model' 字段是 'ir.model' 的类型,它的值是 'mymodule.asset')
- 使用户能够创建新的相关模型('mymodule.asset')实例的新表单在父表单中创建。
- 用户填写资产字段,然后单击“保存”按钮。
- 因此“mymodule.asset_category”、“mymodule.asset”对象被保存到数据库中。
我想我可以通过按顺序显示表单来使用向导来实现这些。但我至少想知道它是否可以通过这种方式实现。 我尝试了以下方式:
class AssetCategory(models.Model):
_name = 'mymodule.asset_category'
name = fields.Char(string=u'Category', required="True")
related_model = fields.Many2one('ir.model', string=u'Related model')
class Asset(models.Model):
_name = 'mymodule.asset'
name = fields.Char(string=u'Asset Name', required="True")
amount = fields.Float(string=u'Amount', digit=[12, 2])
XML 会是这样的:
<record model="ir.ui.view" id="asset_form_view">
<field name="name">mymodule_asset_form</field>
<field name="model">mymodule.asset_category</field>
<field name="arch" type="xml">
<form string="asset category">
<sheet>
<field name="name"></field>
<field name="related_model"></field>
<widget type="my_widget"></widget>
</sheet>
</form>
</field>
</record>
还有 Javascript: “mymodule.asset”参数将在“related_model”下拉列表更改时动态设置。
var MyWidget = Widget.extend({
start:function(){
self = this;
var dataset = new data.DataSet(this, 'mymodule.asset');
var v_id;
dataset._model.call('get_formview_id', [[0], {}]).then(function (view_id) {
v_id = view_id
});
var fields_view_def;
fields_view_def = data_manager.load_fields_view(dataset, v_id, 'form', false);
var form_view = new FormView(self, dataset, fields_view_def, {});
return form_view.appendTo(this.$el);
}
});
core.form_custom_registry.add('my_widget', MyWidget);
我当前的代码抛出以下错误:
http://localhost:8069/web/static/src/js/views/form_view.js:1239
Алдааны мөр:
TypeError: Cannot read property 'attrs' of undefined
at Class.set_fields_view (http://localhost:8069/web/static/src/js/views/form_view.js:1239:49)
at Class.start (http://localhost:8069/web/static/src/js/views/form_view.js:97:31)
at Class.prototype.<computed> [as start] (http://localhost:8069/web/static/src/js/framework/class.js:89:38)
at http://localhost:8069/web/static/src/js/framework/widget.js:193:25
at http://localhost:8069/web/static/lib/jquery/jquery.js:3276:89
at fire (http://localhost:8069/web/static/lib/jquery/jquery.js:3119:58)
at Object.add [as done] (http://localhost:8069/web/static/lib/jquery/jquery.js:3165:49)
at Array.<anonymous> (http://localhost:8069/web/static/lib/jquery/jquery.js:3275:77)
at Function.each (http://localhost:8069/web/static/lib/jquery/jquery.js:383:58)
at Object.<anonymous> (http://localhost:8069/web/static/lib/jquery/jquery.js:3272:56)
【问题讨论】:
-
结果就像FormView inside Widget inside FormView。所以保存按钮也应该是自定义的。
标签: javascript widget odoo odoo-10 formview