首页 > 解决方案 > 模板中显示的Django累积值

问题描述

我是 Django 和 Python 的新手,并且一直在学习 Python Crash Course。我已经完成了,现在一直在制作我自己的 Django 项目,并添加了一些额外的部分。

目前,我有一个模型中的条目表,我用模板显示,表中的每个条目都有一个时间和一些其他数据。我想要的是列中累积时间的值,在每个条目时间旁边,即

上课时间 累计时间
第1课 0.5 0.5
第2课 1 1.5
第三课 1.3 2.8

我只是真的坚持如何完成这项工作,我查看了很多堆栈溢出并尝试了各种我无法正常工作的方法。查看他们使用 annotate() 和 cumsum 的其他示例,但我无法使其正常工作。我已经完成了其他值的计数和总和,但这让我陷入了困境。我认为我需要在我看来循环遍历它,但不确定如何将每个值与累积时间相关联。

任何帮助都会受到极大的欢迎。另外,对不起,这不是很好写或简洁,编程对我来说不是自然而然的。

我的主题.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)

我的模型.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 %}

标签: pythondjango

解决方案


推荐阅读