Как передать идентификатор тега привязки URL-адресам в Django? - PullRequest
0 голосов
/ 06 августа 2020

Я пытаюсь создать функцию «добавить в корзину» для веб-сайта заказа пиццы. Для этого я установил теги привязки, и мне нужно отправить указанный c идентификатор элемента в функцию просмотра из тега привязки, чтобы этот элемент можно было добавить в корзину. Я получаю TypeError с этим кодом, говоря, что «add_to_cart () не хватает 1 необходимого позиционного аргумента: 'item_id'». Я считаю, что это связано с тем, что переменная item.id не передается в urls.py. Кто-нибудь знает, как это правильно решить? Я использую Django 3.0.8, поэтому не знаю, будет ли работать RegEx. Заранее спасибо!

urls.py:

from django.urls import path, include
from django.contrib import admin
from django.contrib.auth.forms import UserCreationForm
from . import views
from users import views as users_views

urlpatterns = [
    path('', views.index, name="index"),
    path('admin/', admin.site.urls),
    path('login/', views.login_view, name="login"),
    path('logout/', views.logout_view, name = "logout"),
    path('register/', users_views.register_view, name = "register"),
    path('menu/', views.menu, name = "menu"),
    path('cart/', views.add_to_cart, name = "add_to_cart"),
    path('cart/<int:item_id>', views.add_to_cart, name = "add_to_cart")
]

views.py:

 def add_to_cart(request, item_id):
    #query database for the correct item
    order_id = Pizza.objects.get(id = item_id)

    #add the new order to the cart
    new_item = Cart.objects.create(order_id)

    #test connection
    return render(request, "orders/homepage.html")

html template:

{% extends "orders/base.html" %}


{% block body %}

<h2>Pizza Menu</h2>
<form action="{% url 'add_to_cart' %}" method="post">
    {% csrf_token %}
<table>
<tbody>
  <thead>
    Regulars
  </thead>

  {% for item in pizza %}


<tr>
  <td> {{ item.item }}, {{ item.toppings }}, Price: {{ item.price }}</td>
  <td>

<a href="{% url 'add_to_cart' item.id %}" data-id = "{{ item.id }}" id = "{{ item.id }}"><button type="info" name="item">Add to Cart</button></a>

</td>

</tr>


</tbody>

{% endfor %}

</table>
</form>
<!--
  <table>

    {% for item in regular_pizza %}

    <ul>
      <li>
        {{ item }}
      </li>
    </ul>

    {% endfor %}

    {% for item in sicilian_pizza %}

    <ul>
      <li>
        {{ item }}
      </li>
    </ul>

    {% endfor %}
  </table> -->

</div>

{% endblock %}

Еще раз спасибо всем, кто может помочь!

1 Ответ

0 голосов
/ 06 августа 2020

Вы переделываете это представление:

path('cart/', views.add_to_cart, name = "add_to_cart"),
path('cart/<int:item_id>', views.add_to_cart, name = "add_to_cart")

Удалите первое и сделайте item_id необязательным, используя регулярное выражение, так что у вас просто есть:

path('cart/(?P<item_id>[0-9]*)', views.add_to_cart, name = "add_to_cart")

Тогда, поскольку item_id необязательно:

def add_to_cart(request, item_id=None):
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...