Я изучаю 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'