I am experiencing a 404 error in the console on my django project

15 Views Asked by At

When I click add to cart on my django ecommerce website, the items are not added to cart and in the console an error message appears:

VM40:1 Uncaught (in promise) Syntax Error: Unexpected token '<', "<!DOCTYPE "... is not valid JSON) and (POST http://127.0.0.1:8000/update_item/ 404 (Not Found)

I tried adding a CSRF token in my views.py and checkout.html files but the CSRF token is not even displayed.

Here is my view.py code.

from django.shortcuts import render
from django.http import JsonResponse
import json
import datetime
from .models import * 

def store(request):

    if request.user.is_authenticated:
        customer = request.user.customer
        order, created = Order.objects.get_or_create(customer=customer, complete=False)
        items = order.orderitem_set.all()
        cartItems = order.get_cart_items
    else:
        #Create empty cart for now for non-logged in user
        items = []
        order = {'get_cart_total':0, 'get_cart_items':0, 'shipping':False}
        cartItems = order['get_cart_items']

    products = Product.objects.all()
    context = {'products':products, 'cartItems':cartItems}
    return render(request, 'store/store.html', context)

def cart(request):

    if request.user.is_authenticated:
        customer = request.user.customer
        order, created = Order.objects.get_or_create(customer=customer, complete=False)
        items = order.orderitem_set.all()
        cartItems = order.get_cart_items
    else:
        #Create empty cart for now for non-logged in user
        items = []
        order = {'get_cart_total':0, 'get_cart_items':0, 'shipping':False}
        cartItems = order['get_cart_items']

    context = {'items':items, 'order':order, 'cartItems':cartItems}
    return render(request, 'store/cart.html', context)
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def checkout(request):
    if request.user.is_authenticated:
        customer = request.user.customer
        order, created = Order.objects.get_or_create(customer=customer, complete=False)
        items = order.orderitem_set.all()
        cartItems = order.get_cart_items
    else:
        #Create empty cart for now for non-logged in user
        items = []
        order = {'get_cart_total':0, 'get_cart_items':0, 'shipping':False}
        cartItems = order['get_cart_items']

    context = {'items':items, 'order':order, 'cartItems':cartItems}
    return render(request, 'store/checkout.html', context)

def updateItem(request):
    data = json.loads(request.body)
    productId = data['productId']
    action = data['action']
    print('Action:', action)
    print('Product:', productId)

    customer = request.user.customer
    product = Product.objects.get(id=productId)
    order, created = Order.objects.get_or_create(customer=customer, complete=False)

    orderItem, created = OrderItem.objects.get_or_create(order=order, product=product)

    if action == 'add':
        orderItem.quantity = (orderItem.quantity + 1)
    elif action == 'remove':
        orderItem.quantity = (orderItem.quantity - 1)

    orderItem.save()

    if orderItem.quantity <= 0:
        orderItem.delete()

    return JsonResponse('Item was added', safe=False)

def processOrder(request):
    transaction_id = datetime.datetime.now().timestamp()
    data = json.loads(request.body)

    if request.user.is_authenticated:
        customer = request.user.customer
        order, created = Order.objects.get_or_create(customer=customer, complete=False)
        total = float(data['form']['total'])
        order.transaction_id = transaction_id

        if total == order.get_cart_total:
            order.complete = True
        order.save()

        if order.shipping == True:
            ShippingAddress.objects.create(
            customer=customer,
            order=order,
            address=data['shipping']['address'],
            city=data['shipping']['city'],
            state=data['shipping']['state'],
            zipcode=data['shipping']['zipcode'],
            )
    else:
        print('User is not logged in')

    return JsonResponse('Payment submitted..', safe=False)

checkout.html

{% extends 'store/main.html' %}
{% load static %}
{% block content %}
     <div class="row">
        <div class="col-lg-6">
            <div class="box-element" id="form-wrapper">
                <form id="form">
                    {% csrf_token %}
                    <div id="user-info">
                        <div class="form-field">
                            <input required class="form-control" type="text" name="name" placeholder="Name..">
                        </div>
                        <div class="form-field">
                            <input required class="form-control" type="email" name="email" placeholder="Email..">
                        </div>
                    </div>
                    
                    <div id="shipping-info">
                        <hr>
                        <p>Shipping Information:</p>
                        <hr>
                        <div class="form-field">
                            <input class="form-control" type="text" name="address" placeholder="Address..">
                        </div>
                        <div class="form-field">
                            <input class="form-control" type="text" name="city" placeholder="City..">
                        </div>
                        <div class="form-field">
                            <input class="form-control" type="text" name="state" placeholder="State..">
                        </div>
                        <div class="form-field">
                            <input class="form-control" type="text" name="zipcode" placeholder="Zip code..">
                        </div>
                        <div class="form-field">
                            <input class="form-control" type="text" name="country" placeholder="Zip code..">
                        </div>
                    </div>

                    <hr>
                    <input id="form-button" class="btn btn-success btn-block" type="submit" value="Continue">
                </form>
            </div>

            <br>
            <div class="box-element hidden" id="payment-info">
                <small>Paypal Options</small>
                <button id="make-payment">Make payment</button>
            </div>
            
        </div>

        <div class="col-lg-6">
            <div class="box-element">
                <a  class="btn btn-outline-dark" href="{% url 'cart' %}">&#x2190; Back to Cart</a>
                <hr>
                <h3>Order Summary</h3>
                <hr>
                {% for item in items %}
                <div class="cart-row">
                    <div style="flex:2"><img class="row-image" src="{{item.product.imageURL}}"></div>
                    <div style="flex:2"><p>{{item.product.name}}</p></div>
                    <div style="flex:1"><p>${{item.product.price|floatformat:2}}</p></div>
                    <div style="flex:1"><p>x{{item.quantity}}</p></div>
                </div>
                {% endfor %}
                <h5>Items:   {{order.get_cart_items}}</h5>
                <h5>Total:   ${{order.get_cart_total|floatformat:2}}</h5>
            </div>
        </div>
    </div>

    <script type="text/javascript">
        var shipping = '{{order.shipping}}'
        var total = '{{order.get_cart_total|floatformat:2}}'

        if (shipping == 'False'){
            document.getElementById('shipping-info').innerHTML = ''
        }

        if (user != 'AnonymousUser'){
            document.getElementById('user-info').innerHTML = ''
         }

        if (shipping == 'False' && user != 'AnonymousUser'){
            //Hide entire form if user is logged in and shipping is false
                document.getElementById('form-wrapper').classList.add("hidden");
                //Show payment if logged in user wants to buy an item that does not require shipping
                document.getElementById('payment-info').classList.remove("hidden");
        }

        var form = document.getElementById('form')

        csrftoken = form.getElementsByTagName("input")[0].value
        console.log('Newtoken' ,form.getElementsByTagName("input")[0].value)
        
        /dform.addEventListener('submit', function(e){
            e.preventDefault()
            console.log('Form Submitted...')
            document.getElementById('form-button').classList.add("hidden");
            document.getElementById('payment-info').classList.remove("hidden");
        })

        document.getElementById('make-payment').addEventListener('click', function(e){
            submitFormData()
        })

        function submitFormData(){
            console.log('Payment button clicked')

            var userFormData = {
                'name':null,
                'email':null,
                'total':total,
            }

            var shippingInfo = {
                'address':null,
                'city':null,
                'state':null,
                'zipcode':null,
            }

            if (shipping != 'False'){
                shippingInfo.address = form.address.value
                shippingInfo.city = form.city.value
                shippingInfo.state = form.state.value
                shippingInfo.zipcode = form.zipcode.value
            }

            if (user == 'AnonymousUser'){
                userFormData.name = form.name.value
                userFormData.email = form.email.value
            }

            console.log('Shipping Info:', shippingInfo)
            console.log('User Info:', userFormData)

            var url = "/process_order/"
            fetch(url, {
                method:'POST',
                headers:{
                    'Content-Type':'applicaiton/json',
                    'X-CSRFToken':csrftoken,
                }, 
                body:JSON.stringify({'form':userFormData, 'shipping':shippingInfo}),
                
            })
            .then((response) => response.json())
            .then((data) => {
                  console.log('Success:', data);
                  alert('Transaction completed');  
                  window.location.href = "{% url 'store' %}"

                })
        }
    </script>
{% endblock content %}
0

There are 0 best solutions below