Передача совокупной суммы на HTML-страницу с помощью представлений на основе классов в Django

#html #python-3.x #django #django-class-based-views #django-aggregation

#HTML #python-3.x #django #django-class-based-views #django-агрегация

Вопрос:

В настоящее время впервые использую агрегацию, пытаясь получить сумму всех «транзакций» и отобразить их на моей HTML-странице. Я использую общие представления на основе классов, в настоящее время в моей функции отображаются транзакции, созданные пользователем. Я могу отобразить баланс, если я верну его из функции, хотя моя функция «отображать только созданные пользователем транзакции» должна иметь приоритет. Я пытаюсь отобразить свой баланс в HTML, вот моя функция в views.py

  class TranListView (ListView):

    model = transactions

    def get_queryset(self): #gets only if user matches
        return self.model.objects.filter(user_id=self.request.user)
    
   
    
    #def get_context_data(self):
     #   cBalance = transactions.objects.all().aggregate(cBalance=Sum('amount'))
      #  return cBalance
  

Шаблон списка:

  <ul>
    <a href="{% url 'landing' %}"> Homepage</a><br><br>
    <a class="btn btn-secondary btn-sm mt-1 mb-1" href="{% url 'taction-create' %}">Create New</a>
    <h5> Transactions: </h5>
    <li> {{ cBalance }}</li>
        {% for object in object_list %}

         <li>{{ object.tname }}</li>
        <li>{{ object.amount }}</li>
        <li>{{ object.date }}</li>
            <li>{{ object.recipient }}</li>
             
             <a class="btn btn-secondary btn-sm mt-1 mb-1" href="{% url 'taction-update' object.id %}">Update</a>
             <a class="btn btn-secondary btn-sm mt-1 mb-1" href="{% url 'taction-delete' object.id %}">Delete</a>
        <hr/>
        {% empty %}
        <li>No objects yet.</li>
        {% endfor %}

</ul>
  

Если кто-нибудь может мне помочь, я был бы очень признателен

Редактировать: получил работу с этим

 class TranListView (ListView):

    model = transactions

    def get_queryset(self): #gets only if user matches
       return self.model.objects.filter(user_id=self.request.user)



    def get_context_data(self, *args, **kwargs):
        context = super(TranListView, self).get_context_data(*args, **kwargs)
        context['cBalance'] = transactions.objects.filter(user_id=self.request.user).aggregate(Sum('amount'))['amount__sum'] or 0.00
        return context    

  

Комментарии:

1. Похоже, мне все еще нужно округлить число, и в итоге я все еще вызывал cBalance в html, поэтому не уверен, нужно ли мне использовать ‘amount__sum’

Ответ №1:

Может быть, вы могли бы попробовать это :

 from django.shortcuts import render
from django.template import loader
from django.http import HttpResponse

class TranListView(ListView):
    
    model = transactions
    
    def get_queryset(self):
        return self.model.objects.filter(user_id=self.request.user)
    
    cBalance = transactions.objects.all().aggregate(cBalance=Sum('amount'))
    
    template = loader.get_template('list.html') # put the name of your html file
    
    context = {
        'cBalance': cBalance,
    }
    
    return HttpResponse(template.render(context, request))
  

Комментарии:

1. Для этого здесь мне понадобится другая функция, чтобы использовать этот второй возврат?