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

Я изучаю Django, и на данный момент я нахожусь на самом базовом c уровне.

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

Теперь я добавил ссылку «добавить» рядом с каждым элементом в списке, чтобы, когда пользователь нажимает на него, этот элемент был добавлен в корзину. (Я пытался сделать то же самое с помощью кнопки «добавить», но, насколько я понял, это подразумевает создание формы, которая будет моей следующей проблемой для решения.)

Я хотел бы отобразить все (пункты меню и сводка корзины) на домашней странице.

Недавно созданная функция представления 'add_to_cart' принимает запрос и элемент и возвращает запрос, тот же HTML, что и home, и в качестве контекста, переменная 'cart_items'.

Моя проблема в том, что я не могу понять, как передать идентификатор элемента, чтобы «получить» этот элемент в запросе и затем добавить его в корзину.

Код, который я создал до сих пор, следующий:

models.py

from django.db import models
from django.contrib.auth.models import User


# Create your models here.
class Item(models.Model):
    name = models.CharField(max_length=25)
    price = models.DecimalField(max_digits=5, decimal_places=2)

    def __str__(self):
        return self.name


class Cart(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)
    items = models.ManyToManyField(Item)

    def __str__(self):
        return 'Order number: %s' % self.id

views.py

from django.shortcuts import render, HttpResponseRedirect
from django.urls import reverse
from .models import Cart, Item
from django.db.models import Sum


# Create your views here.
def home(request):
    items = Item.objects.all()
    carts = Cart.objects.all()
    length = len(Cart.objects.all())
    cart = carts[length - 1]
    cart_items = cart.items.all()
    total = cart_items.aggregate(Sum('price'))['price__sum']
    return render(request, 'cart/home.html', {'cart': cart,
                                              'items': items,
                                              'cart_items': cart_items,
                                              'total': total})


def add_to_cart(request, item):
    item = Item.objects.get(id=item)
    carts = Cart.objects.all()
    length = len(Cart.objects.all())
    cart = carts[length - 1]
    cart_items = cart.items.add(item)
    return render(request,  'cart/home.html', {'cart_items': cart_items})

urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('', views.home, name='home'),
    path('add/', views.add_to_cart, name='add_to_cart')
]

home. html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Home page</title>
</head>
<body>
<div><h1>Menu</h1></div>
{% for item in items %}
<ul>{{ item }} £{{ item.price}} <a href="add/">Add</a></ul>
{% endfor %}
<div><h1>Order</h1></div>S
{{ cart }}
{% for item in cart_items %}
    <ul>{{ item.name }} {{ item.price }}</ul>
{% endfor %}
<h2>Total</h2>
{{ total|floatformat }}
</body>
</html>

Ошибка, которую я получаю при нажатии на ссылку «Добавить», конечно, следующая:

TypeError at / add / add_to_cart () отсутствует 1 обязательный позиционный аргумент: 'item'

1 Ответ

1 голос
/ 21 января 2020

urls.py

    path('add/<int:item>', views.add_to_cart, name='add_to_cart')

home. html

{% for item in items %}
  <ul>{{ item }} £{{ item.price}} <a href="{% url 'add_to_cart' item.id %}">Add</a></ul>
{% endfor %}
...