You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

点击邮件工资单按钮报错:hr.payslip无action_email_payslip_send属性

解决Odoo中hr.payslip无action_email_payslip_send方法的错误

这个报错的核心原因很明确:你定义的方法并没有挂载到原hr.payslip模型上,而是创建了一个全新的模型,导致点击按钮时调用原模型的记录找不到对应方法。下面是一步步的修复方案:

1. 修正模型继承逻辑

你当前的代码通过_name='email.payslip'创建了一个新模型,而不是扩展原hr.payslip模型。修改models/emailpayslip.py,去掉自定义的_name属性,让类直接继承扩展原模型:

from odoo import fields, models, api, _
from odoo.exceptions import Warning

class Emailpayslip(models.Model):
    _inherit = 'hr.payslip'  # 仅保留_inherit,扩展原hr.payslip模型

    @api.multi
    def action_email_payslip_send(self):
        self.ensure_one()
        template = self.env.ref('Email_Payslip.email_template_payslip', False)
        compose_form = self.env.ref('mail.email_compose_message_wizard_form', False)
        ctx = dict(
            default_model='hr.payslip',
            default_res_id=self.id,
            default_use_template=bool(template),
            default_template_id=template and template.id or False,
            default_composition_mode='comment',
        )
        return {
            'name': _('Compose Email'),
            'type': 'ir.actions.act_window',
            'view_type': 'form',
            'view_mode': 'form',
            'res_model': 'mail.compose.message',
            'views': [(compose_form.id, 'form')],
            'view_id': compose_form.id,
            'target': 'new',
            'context': ctx,
        }

2. 确保视图按钮绑定正确

在views/emailpayslip.xml中,需要把「邮件工资单」按钮添加到原hr.payslip的表单视图上,确保按钮调用的是原模型的方法:

<odoo>
    <record id="view_payslip_form_email_inherit" model="ir.ui.view">
        <field name="name">hr.payslip.form.email.inherit</field>
        <field name="model">hr.payslip</field>
        <!-- 继承hr_payroll模块的工资单表单视图 -->
        <field name="inherit_id" ref="hr_payroll.view_payslip_form"/>
        <field name="arch" type="xml">
            <!-- 在已有的"标记为完成"按钮后添加新按钮 -->
            <xpath expr="//button[@name='action_payslip_done']" position="after">
                <button 
                    name="action_email_payslip_send" 
                    string="邮件工资单" 
                    type="object" 
                    class="oe_highlight"
                />
            </xpath>
        </field>
    </record>
</odoo>

3. 验证邮件模板的XML ID

检查data/email_template_data.xml中的模板ID是否和代码里的Email_Payslip.email_template_payslip一致,确保模板绑定的模型是hr.payslip:

<odoo>
    <record id="email_template_payslip" model="mail.template">
        <field name="name">员工工资单邮件模板</field>
        <field name="model_id" ref="hr_payroll.model_hr_payslip"/>
        <field name="subject">您的${object.date_from}至${object.date_to}工资单</field>
        <field name="body_html" type="html">
            <p>亲爱的${object.employee_id.name}:</p>
            <p>附件是您${object.date_from}至${object.date_to}期间的工资单,请查收。</p>
            <p>祝好</p>
        </field>
        <!-- 关联工资单PDF报告作为附件 -->
        <field name="attachment_ids" eval="[(6,0,[ref('hr_payroll.action_report_payslip')])]"/>
    </record>
</odoo>

4. 升级模块生效

在Odoo后台找到Emailpayslip模块,点击「升级」按钮,让所有代码修改生效。

完成以上步骤后,点击「邮件工资单」按钮就会正确调用hr.payslip模型的action_email_payslip_send方法,不会再出现AttributeError了。

内容的提问来源于stack exchange,提问作者Pramod

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:56:09