[英]Django: how to save data to database in django when a condition is met?
我正在编写一个逻辑以允许用户使用他们的借记卡支付物品,该逻辑工作正常。 现在我想在status=successful
时将一些数据保存到数据库中。
当用户购买课程时,我想将course
和购买课程的user
添加到我创建的名为UserCourse
的模型中。
我尝试将 slug 添加到我创建的process_payment
视图中,但它似乎不起作用。 我还有另一个名为payment_response
的视图,用于检查付款是否成功。
如何在数据库中添加购买的course
和购买课程的user
?
视图.py
# The course detail view
def course_details(request, course_slug):
if request.user.is_authenticated:
user = request.user
course = Course.objects.get(slug=course_slug)
@login_required
def course_checkout(request, slug):
course = Course.objects.get(slug=slug)
user = request.user
# form to get the student's name, email, amount of course
if request.method == "POST":
course = Course.objects.get(slug=slug)
name = request.POST.get("name")
email = request.POST.get("email")
amount = request.POST.get("amount")
return redirect(str(process_payment(name,email,amount, course)))
else:
pass
# how to handle courses that are free
if amount == 0:
course = Course.objects.get(slug=slug)
userCourse = UserCourse(user=user, course=course)
userCourse.save()
return redirect('course:course-content', course.slug)
# View that processes the payment
def process_payment(name,email,amount):
auth_token= settings.FLUTTER_SECRET_KEY
hed = {'Authorization': 'Bearer ' + auth_token}
data = {
"tx_ref":''+str(math.floor(1000000 + random.random()*9000000)),
"amount":amount,
"currency":"USD",
"redirect_url":"http://localhost:8000/callback",
"payment_options":"card",
"meta":{
"consumer_id":23,
"consumer_mac":"92a3-912ba-1192a"
},
"customer":{
"email":email,
# "phonenumber":phone,
"name":name
},
"customizations":{
"title":"DexxaEd",
"description":" Limitless Learning For Everyone",
"logo":"https://getbootstrap.com/docs/4.0/assets/brand/bootstrap-solid.svg"
}
}
url = ' https://api.flutterwave.com/v3/payments'
response = requests.post(url, json=data, headers=hed)
response=response.json()
link=response['data']['link']
return link
# view that check for payment status
@require_http_methods(['GET', 'POST'])
def payment_response(request):
status=request.GET.get('status', None)
tx_ref=request.GET.get('tx_ref', None)
print(status)
print(tx_ref)
if status == "successful":
# return HttpResponse('Payment Successful')
return render(request, "payment/payment-success.html")
if status == "cancelled":
return render(request, "payment/payment-failed.html")
# return HttpResponse('Payment Cancelled')
模型.py
class Course(models.Model):
course_title = models.CharField(max_length=100, null=True, blank=True)
slug = models.SlugField(unique=True)
price = models.IntegerField(default=0, null=True, blank=True)
course_creator = models.ForeignKey(User, on_delete=models.CASCADE)
# Model that store the purchased courses
class UserCourse(models.Model):
user = models.ForeignKey(User , null = False , on_delete=models.CASCADE)
course = models.ForeignKey(Course , null = False , on_delete=models.CASCADE, related_name="usercourse")
date = models.DateTimeField(auto_now_add=True)
网址.py
path('callback', payment_response, name='payment_response')
首先更新您的 UserCourse 以将付费字段包含为
class UserCourse(models.Model):
# your previous fields
paid = models.BooleanField(default=False)
在课程结帐功能中创建 usercourse 对象,如果它是免费的,则付费设置为 True 否则为 False
def course_checkout(request, slug):
# previous code
if request.method == "POST":
# your existing code
user_course = UserCourse.objects.create(user=user, course=course)
user_course_id = user_course.id
# your existing code
return redirect(str(process_payment(name, email, amount, course, user_course_id)))
# your other code logic
if amount == 0:
user_course = UserCourse.objects.create(user=user, course=course, paid=True)
# your other code logic
在 payment_response 函数中提供 user_course_id url 参数为
def payment_response(request, user_course_id=None):
status=request.GET.get('status', None)
tx_ref=request.GET.get('tx_ref', None)
if status == "successful":
if user_course_id:
UserCourse.objects.filter(id=user_course_id).update(paid=True)
return render(request, "payment/payment-success.html")
else:
return render(request, "payment/payment-failed.html")
if status == "cancelled":
return render(request, "payment/payment-failed.html")
在流程支付视图中;
def process_payment(name, email, amount, course, user_course_id):
# your existing code only change redirection url in data as
{
"redirect_url":f"http://localhost:8000/callback/{user_course_id}/",
}
在 urls.py
path('callback/<int:user_course_id>/', payment_response, name='payment_response')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.