电商项目调用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
相关产品推荐
相关产品推荐

