Почему Sum () в Django возвращает число с 13 десятичными знаками при оценке чисел только с 2 десятичными знаками? - PullRequest
1 голос
/ 16 января 2020

Я изучаю Django и создаю приложение для корзины. Здесь я пытаюсь отобразить на странице HTML сумму всех цен товаров в корзине.

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

Итак, я делаю здесь, устанавливая переменную 'total', равную сумме всех цен, с использованием документированной функции Sum() здесь .

Проблема в том, что он отображает число с 13 десятичными знаками, хотя моя модель допускает только 2 десятичных знака. Как я могу преодолеть эту проблему?

Вот весь код, и, очевидно, если у вас есть какие-либо советы о лучшем способе «basi c», чтобы сделать это (лучшая практика), пожалуйста, дайте мне знать в комментарии.

'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
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})

и мой 'дом. 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}} <button>Add</button></ul>
{% endfor %}
<div><h1>Order</h1></div>
{{ cart }}
{% for item in cart_items %}
    <ul>{{ item.name }} {{ item.price }}</ul>
{% endfor %}
<h2>Total</h2>
{{ total }}
</body>
</html>

Ответы [ 2 ]

2 голосов
/ 16 января 2020

Если вы используете SQLite, вы должны знать, что он не поддерживает внутреннюю десятичную дробь, как объяснено здесь . Вот почему Sum() возвращает float.

Поэтому следует либо использовать python функции форматирования с плавающей запятой для округления total до 2 десятичных знаков, либо использовать шаблонный шаблон floatformat.

0 голосов
/ 16 января 2020

Вы можете установить сумму в строку, а затем отправить ее на свою страницу HTML в контексте.

total = cart_items.aggregate(Sum('price'))['price__sum']
total = '{:0.2f}'.format(total)

или, если хотите, чтобы она была отформатирована как строка с символом доллара и добавлена запятые (за тысячи долларов):

from django.contrib.humanize.templatetags.humanize import intcomma
...
total = cart_items.aggregate(Sum('price'))['price__sum']
total = f"${intcomma('{:0.2f}'.format(total))}"
...