繁体   English   中英

Django:满足条件时如何将数据保存到 Django 中的数据库?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM