如何在django-oscar-invoices中将InvoiceCreator集成到结账流程
集成oscar_invoices.utils.InvoiceCreator到Django Oscar结账流程的实现方法
以下是两种生产环境常用的集成方案,可根据业务需求选择:
方案1:监听订单信号实现(推荐,低侵入)
不用修改Oscar核心结账流程,通过绑定订单状态变更信号自动触发发票生成,适合绝大多数场景:
- 首先在你自定义的Django应用中新建
signals.py文件,添加如下代码:
from django.db.models.signals import post_save from django.dispatch import receiver from oscar.apps.order.models import Order from oscar_invoices.utils import InvoiceCreator @receiver(post_save, sender=Order, dispatch_uid="create_invoice_after_order_paid") def create_invoice_when_order_paid(sender, instance, created, **kwargs): # 仅在订单创建且状态为已支付时生成发票,可根据业务调整触发条件 if created and instance.status == 'Paid': creator = InvoiceCreator() # 传入订单实例即可生成标准发票,支持自定义字段传参 invoice = creator.create(order=instance) # 自定义参数示例:指定发票号、税率 # invoice = creator.create(order=instance, invoice_number=f"INV-{instance.number}", tax_rate=0.13)
- 在自定义应用的
apps.py中注册信号,确保项目启动时信号生效:
from django.apps import AppConfig class YourAppConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'your_app_name' def ready(self): # 导入信号文件完成注册 import your_app_name.signals
方案2:重写结账视图实现
如果需要对发票生成时机做更精细的控制(比如提交订单时立即生成,无需等待支付完成),可以重写Oscar的结账视图:
- 先按照Django Oscar的标准扩展流程fork checkout应用
- 在fork后的checkout应用的
views.py中,重写PaymentDetailsView的handle_successful_order方法:
from oscar.apps.checkout.views import PaymentDetailsView as CorePaymentDetailsView from oscar_invoices.utils import InvoiceCreator class PaymentDetailsView(CorePaymentDetailsView): def handle_successful_order(self, order): # 先执行原生订单创建逻辑 response = super().handle_successful_order(order) # 触发发票生成 creator = InvoiceCreator() invoice = creator.create(order=order) # 可在此处添加自定义逻辑:关联发票到用户账户、发送发票邮件等 return response
常见注意事项
- 若需要自定义发票样式,可在项目
templates目录下新建oscar_invoices/invoice.html文件,覆盖官方默认模板即可 InvoiceCreator.create()方法返回的是Invoice模型实例,可直接对其扩展字段、关联其他业务模型- 可根据业务需求调整触发发票生成的条件,比如未支付订单生成预发票、退货时生成红字发票等
内容的提问来源于stack exchange,提问作者om78
相关产品推荐
相关产品推荐

