Uncaught (in promise) SyntaxError: Unexpected token '<', "

Изучаю Python, Django по видео уроку, https://www.youtube.com/watch?v=woORrr3QNh8&list=PL-51WBLyFTg0omnamUjL1TCVov7yDTRng&index=19. Столкнулся с проблемой, третий день не могу решить. Может кто-нибудь сможет помочь найти причину. При переходе к оплате, появляются ошибки:

Ошибка в консоли

Консоль PyCharm

Файлы проекта:

templates/store/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">
                    <div id="user-info">
                        <div class="form-field">
                            <input required class="form-control" type="text" name="name" placeholder="Имя..">
                        </div>
                        <div class="form-field">
                            <input required class="form-control" type="email" name="email" placeholder="Email..">
                        </div>
                    </div>

                    <div id="shipping-info">
                        <hr>
                        <p>Информация о доставке:</p>
                        <hr>
                        <div class="form-field">
                            <input class="form-control" type="text" name="address" placeholder="Адрес..">
                        </div>
                        <div class="form-field">
                            <input class="form-control" type="text" name="city" placeholder="Город..">
                        </div>
                        <div class="form-field">
                            <input class="form-control" type="text" name="state" placeholder="Регион..">
                        </div>
                        <div class="form-field">
                            <input class="form-control" type="text" name="zipcode" placeholder="Индекс..">
                        </div>
                    </div>

                    <hr>
                    <input id="form-button" class="btn btn-success btn-block" type="submit" value="Принять">
                </form>
            </div>

            <br>
            <div class="box-element hidden" id="payment-info">
                <small>Данные карты</small>
                <button id="make-payment">Оплатить</button>
            </div>

        </div>

        <div class="col-lg-6">
            <div class="box-element">
                <a  class="btn btn-outline-dark" href="{% url 'cart' %}">&#x2190; Назад в корзину</a>
                <hr>
                <h3>Корзина покупок</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}}&#x20BD</p></div>
                    <div style="flex:1"><p>x{{item.quantity}}</p></div>
                </div>
                {% endfor %}

                <h5>Товар:   {{order.get_cart_items}}</h5>
                <h5>Итого:   {{order.get_cart_total|floatformat:2}}&#x20BD</h5>
            </div>
        </div>
    </div>

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

    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')

    form.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
        }

        var url = '/process_order/'
        fetch(url,{
            method:'POST',
            headers:{
                'Content-Type':'application/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 %}

templates/views.py


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:
        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:
        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)

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:
        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('productId', 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 == float(order.get_cart_total):
            order.complete = True
        order.save()

        if order.shipping == True:
            ShippingAddress.objects.create(
                customer=customer,
                order=order,
                address=data['shipping']['address'],    #порядок как в models
                city=data['shipping']['city'],
                state=data['shipping']['state'],
                zipcode=data['shipping']['zipcode'],
            )

    else:
        print('User is not logged in...')
    return JsonResponse('Payment complete!', safe=False)

При нажатии на кнопку оплаты возникает ошибка:

ValueError: could not convert string to float: '3034,9'

Ошибка возникает после заполения этого куска кода во views.py:

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'],    #порядок как в models
                city=data['shipping']['city'],
                state=data['shipping']['state'],
                zipcode=data['shipping']['zipcode'],
            )

    else:
        print('User is not logged in...')
    return JsonResponse('Payment complete!', safe=False)

Когда он выглядел так:

def processOrder(request):
    print('Data:', request.body)
    return JsonResponse('Payment complete!', safe=False)

ошибки не возникало.

Код по видео перепроверил, вроде, трижды. По логике ошибка должна быть тут:

total = float(data['form']['total'])

но я скорее всего ошибаюсь. Возможно возникает проблема из-за разницы версий Python и Django, видео уже больше двух лет и мог смениться синтаксис. А где в документации это читать я найти не могу.


Ответы (1 шт):

Автор решения: Artem

Спасибо @DiMithras. Никогда б не догадался, что проблема в запятой. Так как я в settings.py поставил язык ru, он локализовал числа и заменил плавающие точки на запятые. Костыль не большой, но помог. Я дописал

total = float(data['form']['total'])

и сделал его

total = float(data['form']['total'].replace(',', '.'))
→ Ссылка