Общая цена товаров для каждой строки заказа и глобальная с Django

#python #django

Вопрос:

Я пытаюсь уже давно, но никак не могу найти решение … Поэтому я спрашиваю здесь, надеясь, что кто-нибудь сможет мне помочь 😉

Вот мои МОДЕЛИ (модели.py в /заказ) :

 class Client(models.Model):
[...]


class Commande(models.Model):
    objects = models.Manager()
    date = models.DateTimeField(auto_now=True)
    client = models.ForeignKey(Client, related_name='clients', on_delete=models.CASCADE)
    remise = models.DecimalField(max_digits=5, decimal_places=2, default=0)
    statut = models.CharField(max_length=200, db_index=True, null=False, blank=False, default='En cours')


class Cartdb(models.Model):
    objects = models.Manager()
    produit = models.ForeignKey(Produit, related_name='produit', on_delete=models.CASCADE)
    qte = models.IntegerField(default=1)
    prix = models.DecimalField(max_digits=10, decimal_places=2, default=15.00)
    commande = models.ForeignKey(Commande, related_name='commande', on_delete=models.CASCADE)

    def add_cartdb(self, produit, qte, prix, commande):
        cartdb = self.create(produit=produit, qte=qte, prix=prix, commande=commande)
        return cartdb
 

Вот мои взгляды (views.py в тот же каталог) :

 def order_list(request, date_before=None, date_after=None, statut_request=None, client_request=None):
    orders_list = Commande.objects.filter(statut='En cours').order_by('-date')

    clients = Client.objects.all()
    client_cmd = None

    if date_before:
        orders_list = orders_list.filter(date >= date_before)
    if date_after:
        orders_list = orders_list.filter(date >= date_after)
    if statut_request:
        orders_list = orders_list.filter(statut=statut_request)
    if client_request:
        client_cmd = get_object_or_404(Client, id=client_request)
        orders_list = orders_list.filter(client=client_cmd)

    paginator = Paginator(orders_list, 10)
    page = request.GET.get('page')

    try:
        orders = paginator.page(page)
    except PageNotAnInteger:
        # If page is not an integer, deliver first page.
        orders = paginator.page(1)
    except EmptyPage:
        # If page is out of range (e.g. 9999), deliver last page of results.
        orders = paginator.page(paginator.num_pages)

    context = {'client_cmd': client_cmd,
               'clients': clients,
               'orders': orders,
               'orders_list': orders_list,
               'paginate': True
               }

    return render(request, 'order/list.html', context)


def order_detail(request, id):
    # order = Commande.objects.filter(id=id)
    commande = get_object_or_404(Commande, id=id)
    orders = Cartdb.objects.filter(commande=commande)
    context = {
        'commande': commande,
        'orders': orders,
    }
    return render(request, 'order/detail.html', context)
 

И, наконец, вот фрагмент html-файла :

 <table class="table table-striped table-hover">
    <thead>
        <tr>
            <th class="text-left">Produit</th>
            <th>Qte</th>
            <th>Prix Unitaire</th>
            <th>Total</th>
        </tr>
    </thead>
    <tbody>
    {% for item in orders %}
    {% with produit=item.produit %}
    <tr>
        <td class="align-middle">
            <a class="btn" href="{{ produit.get_absolute_url }}">{{ produit.nom }}</a>
        </td>
        <td class="align-middle">{{ item.qte }}</td>
        <td class="align-middle">{{ item.prix }} €</td>
        <td class="align-middle">{{ item.total }} €</td>
    </tr>
    {% endwith %}
    {% endfor %}
    <tr class="table-secondary">
        <td colspan="3" class="text-left">Total</td>
        <td colspan="2" class="num">{{ orders.get_total_prix }} €</td>
    </tr>
    </tbody>
</table>
 

В этом Detail.html Мне нужно иметь общую сумму для каждого продукта (qte * prix), и в конце таблицы должна быть общая сумма (сумма всех сумм каждой строки).

Я кое-что пробовал в моделях.py в класс Cartdb, чтобы добавить некоторые функции, такие как get_total и т. Д… но не знаю, как это сделать и как использовать их в представлениях или details.html 🙂

Спасибо за вашу помощь 🙂