点击邮件工资单按钮报错: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
相关产品推荐
相关产品推荐

