<p>这里有两个不同的问题:</p>
<ol>
<li>使字段在窗体中显示为只读。在</li>
<li>确保它不会被修改。在</li>
</ol>
<p>这些都是独立的问题,如果只解决第一点,你将来会得到一个非常令人不快的惊喜。在</p>
<p>不幸的是,Odoo没有提供每个字段的权限框架(<a href="https://www.odoo.com/groups/community-59/community-10336007" rel="noreferrer">you can read my rant about this here</a>)。在</p>
<p>如果你想你可以<a href="https://github.com/EE/bestja/tree/master/addons/protected_fields" rel="noreferrer">use a module I created while working on a project, that addresses this very issue</a>。在</p>
<p>下载模块并将<code>protected_fields</code>添加到模块的依赖项后,您将执行以下操作:</p>
<pre><code>class YourModel(models.Model):
_name = 'your.model'
_inherit = [
'protected_fields.mixin',
]
_protected_fields = ['field_you_want_to_protect']
field_you_want_to_protect = fields.Char()
forbridden_user = fields.Many2one('res.users')
current_user_forbidden = fields.Boolean(compute="_compute_current_user_forbidden")
@api.one
@api.depends('forbridden_user')
def _compute_current_user_forbidden(self):
"""
Compute a field indicating whether the current user
shouldn't be able to edit some fields.
"""
self.current_user_forbidden = (self.forbridden_user == self.env.user)
@api.multi
def _is_permitted(self):
"""
Allow only authorised users to modify protected fields
"""
permitted = super(DetailedReport, self)._is_permitted()
return permitted or not self.current_user_forbidden
</code></pre>
<p>这将负责安全地保护服务器端的字段,并另外创建一个<code>current_user_forbidden</code>字段。当当前用户等于^{<cd4>时,该字段将被设置为<code>True</code>。我们可以在客户端使用它使受保护字段显示为只读。在</p>
<p>将计算字段添加到您的视图中(作为一个不可见的字段-我们只需要它的值可用),并将<code>attrs</code>属性添加到要保护的字段中,其中的域将使该字段在<code>current_user_forbidden</code>字段为<code>True</code>时显示为只读:</p>
^{pr2}$
<p>当然,您应该使用自己想要保护的字段,而不是<code>field_you_want_to_protect</code>。在</p>