Написание корзины django(срочно)
Мне нужно написать корзину для магазина на django. Вот код, что нужно поменять, что бы правильно считались суммы и показывало изображение и название продукта? Я новичёк в этом, и делаю это уже больше недели. Я не понимаю что добавить и в чём ошибка. Тут даже мне уже и chatgpt не помог.
Моя папка для корзины - ecommerce. Файлы ecommerce:
_init.py (пуст)
admin.py
from django.contrib import admin
# Register your models here.
from django.contrib import admin
# Register your models here.
apps.py
from django.apps import AppConfig
class EcommerceConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'ecommerce'
models.py
from django.db import models
from django.contrib.auth.models import User
from gamewarrior.models import Game
class Order(models.Model):
id_user = models.ForeignKey(User, on_delete=models.PROTECT)
price = models.IntegerField(null=True)
status = models.BooleanField(default=False)
created_at = models.DateField(auto_now=True)
updated_at = models.DateField(null=True)
def save(self, *args, **kwargs):
if not self.id:
self.id_user.id
super().save(*args, **kwargs)
class OrderList(models.Model):
id_order = models.ForeignKey(Order, related_name='order', on_delete=models.CASCADE)
id_game = models.ForeignKey(Game, related_name='game', on_delete=models.PROTECT)
price = models.IntegerField(null=True)
tests.py
from django.test import TestCase
# Create your tests here.
urls.py
from django.urls import path
from . import views
app_name = "ecommerce"
urlpatterns = [
path('', views.basket, name='basket'),
path('add/<int:game_id>/', views.add_to_basket, name='add_to_basket'),
path('remove/<int:item_id>/', views.remove_from_basket, name='remove_from_basket'),
path('checkout/', views.checkout, name='checkout'),
]
views.py
from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required
from ecommerce.models import Order, OrderList
from gamewarrior.models import Game
@login_required
def basket(request):
order, created = Order.objects.get_or_create(id_user=request.user, status=False)
order_items = OrderList.objects.filter(id_order=order)
total_price = sum(item.price for item in order_items)
return render(request, "basket.html", {"order": order, "order_items": order_items, "total_price": total_price})
@login_required
def add_to_basket(request, game_id):
game = Game.objects.get(id=game_id)
order, created = Order.objects.get_or_create(id_user=request.user, status=False)
OrderList.objects.create(id_order=order, id_game=game, price=game.price)
return redirect('ecommerce:basket')
@login_required
def remove_from_basket(request, item_id):
item = OrderList.objects.get(id=item_id)
item.delete()
return redirect('ecommerce:basket')
@login_required
def checkout(request):
order = Order.objects.get(id_user=request.user, status=False)
order_items = OrderList.objects.filter(id_order=order)
total_price = sum(item.price for item in order_items)
order.status = True
order.save()
return render(request, "checkout.html", {"order": order, "order_items": order_items, "total_price": total_price})
Моя основная папка проекта - gamewarrior. Файлы, которые взаимодействуют с функцией корзины:
Сама корзина - templates/basket
{% extends "base.html" %}
{% load static %}
{% block content %}
<style>
.order-details {
margin-top: 20px;
border: 1px solid #ccc;
padding: 10px;
background-color: #f9f9f9;
}
.order-details h3 {
font-size: 1.5em;
margin-bottom: 10px;
}
.order-details ul {
list-style-type: none;
padding: 0;
}
.order-details li {
border-bottom: 1px solid #eee;
padding: 10px;
display: flex;
align-items: center;
}
.order-details li img {
margin-right: 10px;
border-radius: 5px;
}
.order-details li h4 {
margin: 0;
}
.order-details li p {
margin: 0;
}
.order-details p.total-price {
font-size: 1.2em;
font-weight: bold;
margin-top: 10px;
}
</style>
<h2>Корзина</h2>
<div class="order-details">
<h3>Ваш заказ</h3>
<ul>
{% if order_items %}
{% for item in order_items %}
<li>
<img src="{{ item.id_game.imagemain.url }}" alt="{{ item.id_game.name }}" style="width: 50px; height: 50px;">
<h4>{{ item.id_game.name }}</h4>
<p>Цена: {{ item.price }} тенге</p>
<a href="{% url 'ecommerce:remove_from_basket' item.id %}">Удалить</a>
</li>
{% endfor %}
<li class="total-price">Общая стоимость: {{ total_price }} тенге</li>
{% else %}
<li>Ваша корзина пуста.</li>
{% endif %}
</ul>
</div>
<div>
<a href="{% url 'ecommerce:checkout' %}" class="site-btn">Оформить заказ</a>
</div>
{% endblock %}
Ссылка в корзину с файла templates/card
{% extends "base.html" %}
{% load static %}
{% block content %}
<style>
.review-section {
background-image: url('https://img.freepik.com/premium-vector/white-and-grey-background-design-template-with-waves_559319-569.jpg?w=1380');
background-size: cover;
background-position: center;
padding: 80px 0;
}
/* Вставляем CSS здесь */
li {
font-size: 15px;
line-height: 1.5;
}
ul.custom-list li,
ol.custom-list li {
font-size: 10px;
}
</style>
<!-- Page section -->
<section class="review-section spad set-bg" >
<div class="container">
<div class="row">
<div class="col-md-6">
<div class="review-item">
<div class="review-cover set-bg">
<img src="{{ model.imagemain }}" alt="{{ model.name }}">
</div>
<div class="review-text">
<h4>{{ model.name }}</h4>
<div class="rating">
<i class="fa fa-star"></i>
<i class="fa fa-star"></i>
<i class="fa fa-star"></i>
<i class="fa fa-star is-fade"></i>
<i class="fa fa-star is-fade"></i>
</div>
<p> Год выхода: {{ model.year }}</p>
<p>{{ model.description }}</p>
</div>
</div>
</div>
<div>
<p>ㅤㅤㅤㅤㅤㅤРазработчик: {{ model.developer }}</p>
<p>ㅤㅤㅤㅤㅤㅤИздатель: {{ model.publisher }} </p>
<p>ㅤㅤㅤㅤㅤㅤМетки: </p>
<div class="user-panel">
{% for tag in tags %}
<li>{{ tag.id_tag }}</li>
{% endfor %}
</div>
</div>
<div class="container">
<a href="{% url 'ecommerce:basket' %}" target="_blank" class="site-btn"><i class="fa fa-shopping-basket" aria-hidden="true"></i> В корзину / {{ model.price }} тенге</a>
</div>
<div class="all">
<input checked type="radio" name="respond" id="desktop">
<article id="slider">
<input checked type="radio" name="slider" id="switch1">
<input type="radio" name="slider" id="switch2">
<input type="radio" name="slider" id="switch3">
<input type="radio" name="slider" id="switch4">
<input type="radio" name="slider" id="switch5">
<div id="slides">
<div id="overflow">
<div class="image">
<article><img src="{{ model.imagecar1 }}" alt=""></article>
<article><img src="{{ model.imagecar2 }}" alt=""></article>
<article><img src="{{ model.imagecar3 }}" alt=""></article>
<article><img src="{{ model.imagecar4 }}" alt=""></article>
<article><img src="{{ model.imagecar5 }}" alt=""></article>
</div>
</div>
</div>
<div id="controls">
<label for="switch1"></label>
<label for="switch2"></label>
<label for="switch3"></label>
<label for="switch4"></label>
<label for="switch5"></label>
</div>
<div id="active">
<label for="switch1"></label>
<label for="switch2"></label>
<label for="switch3"></label>
<label for="switch4"></label>
<label for="switch5"></label>
</div>
</article>
</div>
</section>
<!-- Page section end -->
{% endblock %}
Страница подтвердённой покупки temlates/checkout
{% extends "base.html" %}
{% load static %}
{% block content %}
<h2>Спасибо за ваш заказ!</h2>
<p>Ваш заказ был успешно оформлен.</p>
<p>Общая стоимость: {{ total_price }} тенге</p>
<div class="order-details">
<h3>Детали заказа</h3>
<ul>
{% for item in order_items %}
<li>
<img src="{{ game.imagemain }}" alt="{{ game.name }}" style="width: 50px; height: 50px;">
<h4>{{ game.name }}</h4>
<p>Цена: {{ game.price }} тенге</p>
</li>
{% empty %}
<li>Ваш заказ пуст.</li>
{% endfor %}
</ul>
</div>
{% endblock %}