Skip to content
Advertisement

Reverse for ‘order_successful’ with no arguments not found despite sending an argument. DJANGO

I am new to django. I am making a website for a customer. I am integrating a paypal client side module and followed a video from youtube for the purpose. On order completion, I am trying to go to a page and I am passing it product id so it can retrieve it from the database and display a nice thank you page. But I am getting the following error:

NoReverseMatch at /product-details/payment

Reverse for ‘order_successful’ with no arguments not found. 1 pattern(s) tried: [‘order_success/(?P[^/]+)$’]

Following is my page checkout.html from where I am calling the function:

<script>
          function getCookie(name) {
            let cookieValue = null;
            if (document.cookie && document.cookie !== '') {
              const cookies = document.cookie.split(';');
              for (let i = 0; i < cookies.length; i++) {
                const cookie = cookies[i].trim();
                // Does this cookie string begin with the name we want?
                if (cookie.substring(0, name.length + 1) === (name + '=')) {
                  cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                  break;
                }
              }
            }
            return cookieValue;
          }
          const csrftoken = getCookie('csrftoken');

          var total = '{{price}}'
          var quantityBought = '{{quant}}'
          var prodId = '{{prod.id}}'
            
          var fName = '{{firstName}}'
          var lName = '{{lastName}}'
          var apt = '{{apt}}'
          var street = '{{street}}'
          var city = '{{city}}'
          var state = '{{state}}'
          var zipcode = '{{zipcode}}'
          var country = '{{country}}'
          var email = '{{email}}'
          var phone = '{{phone}}'

          async function completeOrder(){
            var url = "{% url 'paymentComplete' %}"
            const response = await fetch(url, {
              method: 'POST',
              headers:{
                  'Content-type': 'application/json',
                  'X-CSRFToken': csrftoken,
              },
              body:JSON.stringify({'prodID': prodId, 'quantity': quantityBought, 'bill': total, 'fName': fName, 'lName': lName, 'apt': apt, 'street': street, 'city': city, 'state': state, 'zipcode': zipcode, 'country': country, 'email': email, 'phone': phone})
            })
            return response.json();
          }

            createOrder: function(data, actions) {
              // This function sets up the details of the transaction, including the amount and line item details.
              return actions.order.create({
                purchase_units: [{
                  amount: {
                    value: '0.50' /*total*/
                  }
                }]
              });
            },
              onApprove: function(data, actions) {
                // This function captures the funds from the transaction.
                return actions.order.capture().then(function(details) {
                  // This function shows a transaction success message to your buyer.
                  completeOrder()
                  .then( data => {
                    alert(data)
                  });
                  //alert(data)
                  window.location.href = "{% url 'order_successful' DATA=prod.id %}" 
                });
              }
            }).render('#paypal-button-container');
            //This function displays Smart Payment Buttons on your web page.
            
</script>

my main.urls.py is as follows:

from django.conf.urls import include
from django.urls import path
from . import views

#path(name_displayed_in_url, rendering_function, tag_name)

urlpatterns = [
    path('', views.home, name='home'),
    path('all-products', views.all_products, name='all-products'),
    path('request-a-quote', views.request_quote, name = 'RequestQuote'),
    path('contact-us', views.contact_us, name='ContactUs'),
    path('about', views.about, name='about'),
    path('product-details/<int:ID>', views.prod_temp, name='prod_temp'),
    path('ContactUs', views.ContactUs, name='contact-us'),
    path('calcQuote', views.calcQuote, name='calculate-quote'),
    path('product-details/purchase', views.purchase, name='purchase'),
    path('product-details/payment', views.payment, name='payment'),
    path('product-details/paymentComplete', views.paymentComplete, name='paymentComplete'),
    path('order_success/<int:DATA>', views.order_successful, name='order_successful'),
]

following is my paymentComplete.views:

def paymentComplete(request):
    body = json.loads(request.body)

    prod_ID = int(body['prodID'])
    prod_Qt_bought = int(body['quantity'])
    bill_paid = str(body['bill'])

    #loading product from store
    prod_from_store = Product.objects.get(id=prod_ID)
    #previous product quantity    
    previous_Qt = int(prod_from_store.left)

    #amount to be left in store
    newLeft = previous_Qt - prod_Qt_bought


    return JsonResponse(prod_ID, safe=False)

and order_successful.view

def order_successful(request, DATA):

    return render(request, 'order_successful.html', {'DATA':DATA})

following is completeOrder function in checkout.html from where i am calling paymentComplete function in views.py and sending it a post request

**I have narrowed down the problem to urls.py file because if I call order_successful without passing any parameters, I get my page successfully, so its either a wrong way that i am confused about regarding the writing of the urls, or its something wrong I am doing in the JS script where I am calling the function. **

Advertisement

Answer

I have the impression you need to sort out your problem – there is too many things envolved and they do not fit to the error message.
Did you really post the actual versions of your files (urls.y …)?

Your error message:

NoReverseMatch at /product-details/payment

Reverse for 'order_successful' with no arguments not found. 1 pattern(s) tried: ['order_success/(?P[^/]+)$']

I try to explain:

  1. the first line of the error message indicates that you called a url /product-details/payment and Django finds there
    a) in the view a reverse(‘order_successful’) or similar
    b) in the view’s html a tag {% url ‘order_successful’ % }
    AND as there is no additional value given throughs the exception.

As your urls.py contains

path('product-details/payment', views.payment, name='payment'),

I would suggest to search in views.payment and in the rendered html (file is not clear here as you do not post views.payment).

  1. the second line of your error message says
.... tried: ['order_success/(?P[^/]+)$']

this is strange because with your current urls.py you do not have a path that would cause such an error message. With your urls.py it should be

....tried: ['order_success/(?P<DATA>[0-9]+)$']

This is why I ask you to carefully check the files as with the current inconsistency error/related files it is not possible to point you to the a solution.
So agian: did you really post the actual versions of your files (urls.y …)?

Another hint: please search for ‘order_successful’ in all your html’s. if you have some old “comments” in there with {% url ‘order_successful’ %}, django will process that as url tag as long as you do not enclose it in the django specific comments markers

Advertisement