Отправка переменной на бэкенд Django для обработки
Я работаю над скриптом обработки платежей. Фронт-энд - это модуль javascript, а бэк-энд - приложение Django. Кажется, что в моем коде чего-то не хватает, и я не могу это определить. Вот части приложения:
{% extends 'dash.html' %}
{% load static %}
{% block 'title' %} Subscription | Simpledocs {% endblock %}
{% block extra_title %}<h2>Subscription</h2>{% endblock %}
{% block paymentInfo %} {% endblock %}
{% block content %}
<div class="columns is-centered">
<div class="column is-5 box">
{% if company.paid_till < today %}
<form action="" method="POST" enctype="multipart/form-data">
{% csrf_token %}
<div class="content">
<h1 class="title is-4">
<i class="fa fa-exclamation-triangle" aria-hidden="true"></i>
Account is not active
</h1>
Your company <strong>{{user_organization.organization}}</strong> is not active. Please renew the subscription.<br>
</div>
{% else %}
<p class="label">We have great subcription options for you. Choose from our list either for monthly or annual plans</p><br>
{% endif %}
<h2>Subscription Packages</h2><br>
<div class="select">
<select
name="search"
onchange="updateButtonDataAmount(event)"
>
<option value="select-a-plan">Select A Plan</option>
<option value="7.99">Starter - Monthly ($7.99/Month)</option>
<option value="79.00">Starter - Annually ($79.00/Year)</option>
<option value="49.00">Business - Monthly ($49.90/Month)</option>
<option value="499.00">Business - Annually ($499.00/Year)</option>
</select>
</form>
</div><br><br>
<div id="searched-subs"></div><br><br>
<button class="intaSendPayButton button is-btn-mycolor is-fullwidth"
data-amount="10"
data-currency="KES"
data-email="joe@doe.com"
data-first_name="JOE"
data-last_name="DOE"
data-country="KE">
Pay Now
</button><br>
</div>
</div>
<script>
new window.IntaSend({
publicAPIKey: "publishing_key",
live: false //set to true when going live
})
.on("COMPLETE", (results) => {
// Send the results to the Django backend
fetch("{% url 'paid' %}", {
method: 'POST',
body: JSON.stringify(results)
});
// redirect to a success page
window.location.href = "{% url 'paid' %}";
})
.on("FAILED", (results) => {
// Send the results to the Django backend
fetch("{% url 'paid' %}", {
method: 'POST',
body: JSON.stringify(results)
});
// redirect to a success page
window.location.href = "{% url 'paid' %}";
})
.on("IN-PROGRESS", (results) => console.log("Payment in progress status", results))
Вот бэкенд на django. Процесс оплаты происходит на странице "Subscription" и должен отправлять результаты на страницу "Paid" для обработки.
from django.http.response import HttpResponse
from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login, logout
from django.contrib import messages
from ..decorators import renew_company
from ..forms import *
from ..models import *
from organizations.models import Organization, OrganizationUser, OrganizationOwner
from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import User
from django.views.decorators.csrf import csrf_exempt
from datetime import datetime
from django.http import JsonResponse
@login_required(login_url='login')
def subscription(request):
user = request.user
user_organization = OrganizationUser.objects.get(user=user)
company = Company.objects.filter(name = user_organization.organization.name).first()
today = datetime.date.today()
form = CompanyForm(request.POST)
subscription = Subscription.objects.all()
if user_organization.is_admin == True:
if request.method == "POST":
# Get the payment processing results from the request data
results = request.GET.get("results")
# Render the paid page, passing the results to the template
return redirect ('paid')
context = {'user_organization': user_organization, 'form': form,
'subscription': subscription, 'company': company, 'today': today}
return render(request, 'registration/subscription.html', context)
else:
return HttpResponse('You are not authorised to view this page')
def paid(request):
# Get the results variable from the request body
results = request.POST.get("results")
# return a response to the client
return HttpResponse(results)
Проще говоря, как мне отправить переменную "Results" для отображения на бэкенде django?
Не уверен, что есть достаточно информации, чтобы ответить на этот вопрос...
В приведенном вами шаблоне есть только {% url 'paid' %}
, поэтому я не знаю, как вызывается метод subscription
. Метод subscription
содержит код, который работает только на POST
, но затем пытается получить данные из request.GET
. Затем он пытается redirect('paid')
, но это не вызовет POST
на paid
с данными. Он просто возвращает ответ 302 с URL представления paid
и без данных.
Я не знаком с кодом JavaScript, но похоже, что он помещает results
непосредственно в тело. Это означает, что в теле не будет написано results
, оно просто будет содержать значения из переменной, которая была использована для заполнения тела. Таким образом, request.POST.get('results')
будет пустым. Вы можете попробовать поместить что-то вроде print(request.POST)
и посмотреть, как выглядит содержимое, чтобы понять, как к нему обращаться.