Совокупное значение Django, отображаемое в шаблоне

#python #django

Вопрос:

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

В настоящее время у меня есть таблица записей из моей модели, которую я отображаю с помощью шаблона, каждая запись в таблице содержит время и некоторые другие данные. Что бы мне хотелось, так это значение суммарного времени в столбце рядом с каждым временем записи, т. Е.

Урок Время урока совокупное время
Урок 1 0.5 0.5
Урок 2 1 1.5
Урок 3 1.3 2.8

Я просто действительно зациклился на том, как это сделать, я просмотрел множество переполнений стека и перепробовал различные способы, которые я просто не могу заставить работать правильно. Глядя на другие примеры, они используют аннотации() и cumsum, но я не смог заставить это работать. Я сделал подсчет и суммирование других значений, но это заставило меня застрять. Я думаю, что мне нужно просмотреть его в своем представлении, но я не уверен, как связать каждое значение с совокупным временем.

Любая помощь будет принята с благодарностью. Кроме того, извините, что это не очень хорошо написано или сжато, программирование для меня не является естественным.

Мой topics.py

 def topics(request):
    """Show all the topics"""
    
    # Get the public topics 
    public_topics = Lessontopic.objects.filter(public=True).order_by('date_added')
    # Get the private topics
    if request.user.is_authenticated:
        private_topics = Lessontopic.objects.filter(owner=request.user).order_by('date_added')
        topics =  private_topics
        """By Adding private into topics, seeing all public topics not just users
        this way any topic added by authenticated user comes up in private, even if
        it is also visible in public"""

        time = Lessontopic.objects.aggregate(Sum('lesson_time'))
        total_time = time.get('lesson_time__sum')
        total_time = float(total_time)
        lessons = Lessontopic.objects.all().count()
        print(f"There has been {lessons} lessons ")
        solo = (Lessontopic.objects.filter(solo_lesson=True)
            .aggregate(Sum('lesson_time')))
        solo_time = solo.get('lesson_time__sum')
        print(f"solo lesson flying time {solo_time} hours")
        solo_num = Lessontopic.objects.filter(solo_lesson=True).all().count()
        dual = (Lessontopic.objects.filter(solo_lesson=False)
            .aggregate(Sum('lesson_time')))
        dual_time = dual.get('lesson_time__sum')
        remaining_time = 50 - total_time    
        
        #Make a pie chart.
        labels = ['Solo', 'Dual']
        values = [solo_time, dual_time]
        chat = ['this is long']
        # Visualise the results
        data=[Pie(labels=labels,text=chat,values=values,pull=[0.1, 0],
            textposition='outside')
            ]

        x_axis_config = {'title': 'Hours'}
        y_axis_config = {'title': 'Lesson type'}
        my_layout = Layout(title='Flying time Solo vs Dual Instruction',title_font_color='black'    ,
                title_font_size=30, title_x=0.5, legend_bordercolor='green', legend_borderwidth=5   )
        fig = ({'data': data, 'layout': my_layout})
        div = offline.plot(fig, auto_open=False, output_type='div')

        cumulative_time = Lessontopic.objects.annotate(
                            cumulative_times=Window(
                            expression = Sum('lesson_time'),
                            order_by=F('date_added').asc(),
                            frame=RowRange(start=None, end=0)
                            )
                        )

        context = {'topics': topics, 'cumulative_time':cumulative_time,'lessons':lessons, 'solo_time':solo_time,
                'solo_num':solo_num, 'dual_time':dual_time,'solo_num':solo_num,
                'remaining_time':remaining_time, 'dual':dual,'graph':div,}


    else:
        topics = public_topics
        context = {'topics': topics}

    return render(request, 'flying_logs/topics.html', context)
 

my model.py

 from django.db import models
from django.contrib.auth.models import User
from django.forms.widgets import DateInput 
from django import forms
import json
import requests 

# Create your models here.

class Lessontopic(models.Model):
    """The topic of each lesson or day flying"""
    text= models.CharField(max_length=200)
    date_added = models.DateTimeField(auto_now_add=True)
    owner = models.ForeignKey(User, on_delete=models.CASCADE)
    public = models.BooleanField(default=False, verbose_name="Make post public?",
        help_text="click on this form if you want it to be viewed by anyone")
    lesson_number =  models.PositiveIntegerField(blank=True, null=True)
    lesson_time = models.DecimalField('enter flight time', max_digits=2, decimal_places=1)
    solo_lesson = models.BooleanField(default=False, verbose_name="Were you  solo for the lesson",
            help_text="Click if were flying solo for the lesson")
    runway_direction = models.PositiveIntegerField(
             verbose_name="Select runway direction: 07 or 25")
    number_landings = models.PositiveIntegerField(blank=True, default=1,
                            help_text="Enter how many landings")


    date = models.DateTimeField()

    time_of_lesson = models.PositiveIntegerField(
             verbose_name="time that the lesson started")

    weather_data = models.CharField(max_length=200)
    adding = models.TextField(default=None, null=True, blank=True)

    def __str__(self):
        """Return a string representation of the modeel"""
        return self.text

 

Мой шаблон topics.html

 
{% extends "flying_logs/base.html" %}
  <h1>Topics</h1>
{% block page_header %}
    {% endblock page_header %}  

{% block content %}

<div class="container">

    <table class="table text-center  table-hover table-bordered" >
        
    <tr><tr class="table-primary">
      <th style="width: 10%">Lesson No.</th>
      <th scope="col">Date</th>
      <th scope="col">Lesson</th>
      <th scope="col">Dual/Solo
      <th scope="col">Flying time</th>
      <th scope="col">Cumulative</th>
    </tr>
  </thead>

        {% for topic in topics %}

            {% if topic.solo_lesson %} 
            <tr class="table-success">
                {% endif %}         
                <td class="text-center"> {{topic.lesson_number}}</td>
                <td>{{ topic.date|date:'d/m/Y'}}</td>
                <td><a href="{% url 'flying_logs:topic' topic.id %}">{{ topic }}</a></td>
                <td>{{ topic.solo_lesson|yesno:"Solo, Dual"  }}</td>
                <td class="text-center">{{topic.lesson_time}}</td>
                <td>Time so far{{ cumulative_time}}</td>
            </tr>
        {% endfor %}</table>
        
</div>

<div class="container">
    <table class="table text-center table-hover table-bordered" >
    <thread>    
    <tr><tr class="table-primary">
      
      <th style="width: 5%">Solo</th>
      <th style="width: 20%">Dual</th>
      <th style="width: 20%">total time</th>
      <th style="width: 20%">Time remaing</th>
      <th style="width: 20%"> Solo Lessons</th>
      <th style="width: 35%">Number of lessons</th>

           
    </tr>
  </thead>
  
            
       
        
                <td>{{solo_time|floatformat:1}}</td>
                <td>{{dual_time|floatformat:1}}</td>
                <td>{{total_time}}</td>

                {% if remaining_time >= 0 %} 
                <td class="table-danger">{{ remaining_time|floatformat:1 }}</td>
                {% elif remaining_time <= 0 %}
                <td class="table-success">You've done the minimum hours!!</td>
        

                {% endif %}
                <td class="text-center"> {{ solo_num}} </td>
                <td>{{lessons}}</td>

      </tr>
      </tr>
      
      </table>
      </div>



    
    <h3><a href="{% url 'flying_logs:new_topic' %}"><button name="new entry"
        class="btn btn-primary">Add a new topic</button></a></h3>

{% if graph %}
<div style="width:600;height:500">
{{ graph|safe }}
</div>
{% endif %}


{% endblock content %}
 

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

1. Похоже, вы не используете свою cumulative_time переменную (в которой вы сделали сумму с помощью выражений окна) в своем шаблоне, чего вы ожидаете?

2. Извиняюсь, я играл с представлениями и контекстом, пытаясь заставить его работать, и упустил, что я не вернулся к тому, как должно было быть. Я отредактировал шаблон, чтобы все было правильно.

3. cumulative_time это набор запросов, вы должны зацикливаться на нем , а не зацикливаться topics , плюс, чтобы он был согласованным, выполняйте на нем те же фильтры, что и на topics нем .

4. Потрясающе, спасибо. Таким образом, у меня был бы еще один цикл внутри моего цикла тем в шаблоне? извините, если это действительно просто, я действительно зациклился на этом.