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

电商项目调用PaystackPayment函数出现缺少request参数错误

问题分析与解决

错误 PaystackPayment() missing 1 required positional argument: 'request' 的核心原因是视图函数与模型类同名,导致在视图内部创建支付记录时,误调用了视图函数而非模型类。

你的视图函数名为PaystackPayment,同时模型类也叫PaystackPayment。当你在代码里写payment = PaystackPayment()时,Python会优先调用当前作用域内的视图函数(因为视图函数在当前views模块中定义),而视图函数需要request参数,所以抛出了参数缺失的错误。

两种解决方法

方法1:重命名视图函数(推荐,符合PEP8规范)

将视图函数的名字改为小写加下划线格式,避免与模型类冲突:

修改views.py中的函数名:

def paystack_payment(request):  # 修改函数名
    try:
        order = Order.objects.get(user=request.user, ordered=False)
        secret_key = settings.PAYSTACK_SECRET_KEY
        ref = create_ref_code()
        amount = int(order.get_total() * 100)
        client_credentials = request.user.email
        paystack_call = TransactionResource(
            secret_key, ref)
        response = paystack_call.initialize(
            amount,
            client_credentials
        )

        authorization_url = response['data']['authorization_url']
        # 现在调用的是模型类,不会再混淆
        payment = PaystackPayment()
        payment.user = request.user
        payment.ref = ref
        payment.email = client_credentials
        payment.amount = int(order.get_total())
        payment.save()

        # 后续代码保持不变...

同步更新urls.py中的引用:

from django.urls import path
from .views import (PurchaseSearch, paystack_payment, Checkout)  # 同步修改导入的函数名

app_name = 'core'

urlpatterns = [
    path('checkout/', Checkout.as_view(), name='checkout'),
    path('make-payment/', paystack_payment, name='payment')  # 同步修改视图引用
]

方法2:明确指定模型类的引用

如果不想修改视图函数名,可以在views.py中给模型类起别名,明确区分视图和模型:

修改views.py的导入部分:

from .models import PaystackPayment as PaystackPaymentModel  # 给模型类添加别名

然后在创建支付记录时使用别名:

# 创建支付记录,使用模型别名调用
payment = PaystackPaymentModel()
payment.user = request.user
payment.ref = ref
payment.email = client_credentials
payment.amount = int(order.get_total())
payment.save()

额外注意点

检查order.paystack_payment = payment.amount这一行,如果order模型中的paystack_payment字段是外键(关联PaystackPayment模型),则应该赋值payment对象而非金额,否则会导致外键关联错误:

order.paystack_payment = payment  # 改为赋值支付对象
order.save()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 03:35:19