Default_get函数为什么会执行两次?
- 
python
<br />def default_get(self, cr, uid, fields_list, context=None):<br />    if 'name' in fields_list:<br />        trial_account = self.pool.get('ir.sequence').get(cr, uid, 'web.account.trial')<br />        res.update({'name': trial_account})<br />def button_confirm(self, cr, uid, ids, context=None):<br />    return True<br />
XML<br />…………<br /> <field name="name" placeholder="请在此填入账户名称"/><br /> <footer><br />      <button name="button_confirm" type="object" string="确认" class="oe_highlight"/><br />              or<br />      <button string="Cancel" class="oe_link" special="cancel" /><br /> </footer><br />
新建对话框的时候,name默认获得一个新的帐号,如T00001,是一个自增帐号。
现在的问题是,新建对话框后,name显示T00001,但是点击“确认”按钮后,name就变成T00002了,保存在数据库中的也是T00002,T00001只是显示一下,没有被保存住。
测试了一下,发现新建的时候,default_get运行了一次,点击确认关闭对话框的时候,default_get又运行了一次,或以再次抓取了一个新的name。
请问为什么default_get会运行两次呢?或者有什么办法解决这个问题?
谢谢! - 
以代码回复:
第一次 调用 default_get 是,当你点击 button new 的时候:
参见view_form.js<br />    on_button_new: function() {<br />        var self = this;<br />        this.to_edit_mode();<br />        return $.when(this.has_been_loaded).then(function() {<br />            if (self.can_be_discarded()) {<br />                return self.load_defaults();<br />            }<br />        });<br />    },<br /><br /><br />    load_defaults: function () {<br />        var self = this;<br />        var keys = _.keys(this.fields_view.fields);<br />        if (keys.length) {<br />            return this.dataset.default_get(keys).then(function(r) {<br />                self.trigger('load_record', r);<br />            });<br />        }<br />        return self.trigger('load_record', {});<br />    },<br /><br />
var keys = _.keys(this.fields_view.fields) 这样会去取所有字段的默认值。
第二次调用 default_get 是 orm.py 的 create 方法:<br />    def create(self, cr, user, vals, context=None):<br />"""<br />        vals = self._add_missing_default_values(cr, user, vals, context)<br />"""<br />
那么我们来看一下 _add_missing_default_values 函数:<br />    def _add_missing_default_values(self, cr, uid, values, context=None):<br />        missing_defaults = []<br />        avoid_tables = [] # avoid overriding inherited values when parent is set<br />        for tables, parent_field in self._inherits.items():<br />            if parent_field in values:<br />                avoid_tables.append(tables)<br />        for field in self._columns.keys():<br />            if not field in values:<br />                missing_defaults.append(field)<br />        for field in self._inherit_fields.keys():<br />            if (field not in values) and (self._inherit_fields[field][0] not in avoid_tables):<br />                missing_defaults.append(field)<br /><br />        if len(missing_defaults):<br />            # override defaults with the provided values, never allow the other way around<br />            defaults = self.default_get(cr, uid, missing_defaults, context)<br /><br />。。。。。。<br />
以上,missing_defaults 就是需要获取默认值的列,那么为什么有些字段会重复取值呢, 原因是 create 方法参数 vals 中仅仅保持了 form view 中定义的字段,而第一次取的字段值,可能会因为 form view 中没有对于字段,而被丢弃了。所以,在 create 方法中,会认为该字段没有赋值,因此又会添加到 missing_defaults 再取一次默认值。
原因找到了,解决方法就不难了吧。
其中一种BT的方法是,在 FORM VIEW 定义一个 field invisable = True 的字段,隐藏带上来。 - 
[quote author=wangbuke link=topic=9918.msg19783#msg19783 date=1377068877]
......
那么为什么有些字段会重复取值呢, 原因是 create 方法参数 vals 中仅仅保持了 form view 中定义的字段,而第一次取的字段值,可能会因为 form view 中没有对于字段,而被丢弃了。所以,在 create 方法中,会认为该字段没有赋值,因此又会添加到 missing_defaults 再取一次默认值。
[/quote]
感谢buke的精彩回复,这里我举个例子说一下为什么form view的字段会被丢弃的原因:
例如字段定义[b]readonly[/b]了,那样就会出现上述buke所描述的情形。
待lz分析下自己问题的出现原因。