Почему моя сессия Django не хранит ключи правильно, когда в URLconf используется конвертер путей?

Я работаю над приложением корзины в моем проекте электронной коммерции и наткнулся на эту ошибку, которую я не могу понять. Когда пользователь добавляет товар в корзину, он должен хранить id товара и количество в словаре. Количество должно увеличиваться, если пользователь добавляет больше одного и того же товара.

Я заметил, что когда я указываю в URLconf преобразователь путей 'int', это ведет себя не так, как ожидалось. Когда пользователь добавляет еще одно количество того же самого товара, вместо того, чтобы увеличить текущее значение, он добавляет в словарь еще один ключ типа string.

Форма для принятия желаемого количества:

<form action="{% url 'add_to_basket' product.id %}" method="POST">
    {% csrf_token %}
    <div class="row justify-content-center">
        <div class="col-10 col-md text-md-end">
            <label class="col-form-label" for="qty_input_{{ product.id }}">Quantity:</label>
        </div>
        <div class="col-10 col-md">
            <input name="quantity" type="number" class="form-control" value="1" min="1" max="99"
                id="qty_input_{{ product.id }}">
        </div>
        <div class="col-10 col-md mt-2 mt-md-0">
            <input type="submit" class="btn bg-red btn-outline-dark border-0" value="Add to Basket">
        </div>
        <input type="hidden" name="redirect_url" value="{{ request.path }}">
    </div>
</form>

Вид:

def add_to_basket(request, product_id):
    if request.method == 'POST':
        quantity = int(request.POST['quantity'])
        basket = request.session.get('basket', {})
        url = request.POST['redirect_url']

        if product_id in basket:
            basket[product_id] += quantity
        else:
            basket[product_id] = quantity

        request.session['basket'] = basket
        print(request.session['basket'])

        return redirect(url)

Urlconf:

urlpatterns = [
    path('', views.basket, name='basket'),
    path('<int:product_id>', views.add_to_basket, name='add_to_basket')
]

Словарь после первого добавления пользователем элемента (в данном случае 2 элемента):

{1: 2}

Дикционарий после того, как пользователь второй раз добавит предмет (в этот раз 3):

{'1': 2, 1: 3}

Все работает, если я не использую конвертер путей, но мне просто интересно, что происходит и что я делал неправильно. Большое спасибо!

Вернуться на верх