Удалить уникальный предмет из корзины в Django - PullRequest
0 голосов
/ 26 марта 2020

Я пытаюсь удалить элемент из cart, и у меня есть некоторые проблемы, чтобы сделать это. Вот функция:

def cart_contents(request):
    """
    Ensures that the cart contents are available when rendering
    every page
    """
    cart = request.session.get('cart', {})
    cart_items = []
    total = 0
    destination_count = 0
    for id, quantity in cart.items():
        destination = get_object_or_404(Destinations, pk=id)
        #remove = request.session.pop('cart', {id}) <<<<<<
        price = destination.price
        total += quantity * destination.price
        destination_count += quantity
        cart_items.append({'id': id, 'quantity': quantity, 'destination': destination, 'price':price, 'remove':remove})
    #cart_item will loop into the cart.
    return {'cart_items': cart_items, 'total': total, 'destination_count': destination_count}

Шаблон. html

{% for item in cart_items %}

{{ item.remove }}

{% endfor %}

Я добавил переменную удаления remove = request.session.pop('cart', {id}), но если я использую ее в коде, она сначала не будет Позвольте мне добавить более одного элемента, и когда я нажимаю кнопку tra sh, чтобы удалить элемент, он удаляет все cart в сеансе. На следующем изображении есть два элемента в карточке, основанные на его идентификаторе и количестве {'id', quantity} = {'2': 1, '3': 2}.

shopping cart

Ответы [ 2 ]

2 голосов
/ 26 марта 2020

request.session.pop('cart') удалит корзину в сеансе. Предполагая, что при нажатии на значок удаления вы передаете идентификатор элемента корзины, вы можете получить корзину из сеанса, удалить необходимый идентификатор и снова установить сеанс с новым значением корзины:

cart = request.session.get("cart", {})
id_to_be_removed = request.POST["id_to_be_removed"]

# do other things here or anywhere else

if id_to_be_removed in cart:
   del cart[id_to_be_removed]  # remove the id
   request.session["cart"] = cart

# return
0 голосов
/ 12 апреля 2020

Я нашел ответ. Я заставил cart и quantity соотносить друг друга. Таким образом, если у вас есть три элемента в корзине, вы можете удалять / уменьшать их, пока не достигнете 0 в корзине, и если это так, корзина будет перенаправлена ​​на URL-адрес назначения.

def adjust_cart(request, id):
    """
    Adjust the quantity of the specified product to the specified
    amount

    url for this function should be <str:id> not <int:id>
    - otherwise you need to add str() method for each dict representation.
    """
    cart = request.session.get('cart', {})
    quantity = cart[id] - 1 #decreases the cart quantity until deletes from cart

    if quantity > 0:
        cart[id] = quantity
    else:
        cart.pop(id)
    request.session['cart'] = cart
    if not cart: #if all products be deleted from cart return to destination page
        return redirect(reverse('destination'))
    return redirect(reverse('view_cart'))

корзина. html

{% for item in cart_items %}
</tr>
...
  <td class="border-0 align-middle"><a href="{% url 'adjust_cart' item.id%}" class="text-dark"><i class="fa fa-trash"></i></a></td>
</tr>
 {% endfor %}

url.py

from django.urls import path
from . import views

urlpatterns = [
    ...
    ...
    path('adjust/<str:id>/', views.adjust_cart, name="adjust_cart"),
]

Помня, что cart_items - это список с добавленным словарем. Пожалуйста, если какая-либо аббревиатура не так, вы можете исправить меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...