Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在django模板中对模型的元素求和并返回总数?_Python_Django_Django Models_Django Forms_Django Views - Fatal编程技术网

Python 如何在django模板中对模型的元素求和并返回总数?

Python 如何在django模板中对模型的元素求和并返回总数?,python,django,django-models,django-forms,django-views,Python,Django,Django Models,Django Forms,Django Views,我是Django的新手,在花了很多时间(但仍然被卡住)之后,我想寻求一些专家的帮助 在这个小项目中,我试图实现的是一个网页,返回用户投资的总金额(目前仅限现金投资)。我已经创建了一些python脚本来获取外汇汇率 我试图用英镑总结所有金额,但我被卡住了!我不知道是应该在模型(Cash)中还是在视图中执行此操作,以及如何在模板(Cash_list.html)中显示它 非常感谢你的帮助 下面的工作 models.py from django.db import models class fx_ta

我是Django的新手,在花了很多时间(但仍然被卡住)之后,我想寻求一些专家的帮助

在这个小项目中,我试图实现的是一个网页,返回用户投资的总金额(目前仅限现金投资)。我已经创建了一些python脚本来获取外汇汇率

我试图用英镑总结所有金额,但我被卡住了!我不知道是应该在模型(Cash)中还是在视图中执行此操作,以及如何在模板(Cash_list.html)中显示它

非常感谢你的帮助

下面的工作

models.py

from django.db import models

class fx_table(models.Model):
    eur_to_gbp_pair = 'EUR/GBP'
    aud_to_gbp_pair = 'AUD/GBP'
    usd_to_gbp_pair = 'AUD/USD'

    eur_to_gbp = models.FloatField(default=0)
    aud_to_gbp = models.FloatField(default=0)
    usd_to_gbp = models.FloatField(default=0)

    date_time = models.CharField(max_length=264,unique=True,default='')

class Cash(models.Model):
    reference = models.CharField(max_length=128)
    amount = models.FloatField(default=0)
    currency = models.CharField(max_length=128)
forms.py

from django import forms
from fx_rates_app.models import Cash
from fx_rates_app.models import Shares


class NewUserFormCash(forms.ModelForm):
    class Meta():
        model = Cash
        fields = '__all__' #You want to be able to change all the fields


class NewUserFormShares(forms.ModelForm):
    class Meta():
        model = Shares
        fields = '__all__'
Python脚本

import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE','fx_rates_project.settings')

import django
django.setup()


from fx_rates_app.models import fx_table

import pandas_datareader.data as web
from datetime import datetime
os.environ["ALPHAVANTAGE_API_KEY"] = 'XXXXXXXXXX'
fx_gbp_to_eur = web.DataReader("GBP/EUR","av-forex")
eur = float(fx_gbp_to_eur[4:5].values[0][0])

fx_gbp_to_aud = web.DataReader("GBP/AUD","av-forex")
aud = float(fx_gbp_to_aud[4:5].values[0][0])


fx_gbp_to_usd = web.DataReader("GBP/USD","av-forex")
usd = float(fx_gbp_to_usd[4:5].values[0][0])

from datetime import datetime

now = datetime.now()

dt_string = now.strftime("%d/%m/%Y %H:%M:%S")

webpg1 = fx_table.objects.get_or_create(eur_to_gbp=eur,aud_to_gbp=aud,usd_to_gbp=usd,date_time=dt_string)[0]
views.py

from django.shortcuts import render
from fx_rates_app.models import fx_table
from fx_rates_app.forms import NewUserFormCash,NewUserFormShares
from django.views.generic import TemplateView,ListView
from django.urls import reverse
from fx_rates_app import forms
from fx_rates_app.models import Cash, Shares,fx_table
import datetime

class CashListView(ListView):
    model = Cash
    context_object_name = 'cash_details'

    def get_context_data(self, **kwargs):
        context = super(CashListView, self).get_context_data(**kwargs)
        context.update({
            'fx_list': fx_table.objects.all(),
            'insert': datetime.datetime.now(),
        })
        return context

class SharesListView(ListView):
    model = Shares
    context_object_name = 'shares_details'

    def get_context_data(self, **kwargs):
        context = super(SharesListView, self).get_context_data(**kwargs)
        context.update({
            'fx_list': fx_table.objects.all(),
        })
        return context

def Cash(request):

    form_cash = NewUserFormCash()

    if request.method == "POST":
        form_cash = NewUserFormCash(request.POST) 

        if form_cash.is_valid():
            form_cash.save(commit=True)
            return index(request)

        else:
            print('ERROR FORM INVALID')

    return render(request,'fx_rates_app/cash_positions.html',{'form':form_cash}) 
url.py

from django.urls import path
from fx_rates_app import views
from fx_rates_app.views import CashListView,SharesListView,FxListView

app_name = 'fx_rates_app'


urlpatterns = [
    path('fx/',FxListView.as_view(), name='fx'),
    path('cash_positions/',views.Cash,name='cash_positions'),
    path('shares/',views.Shares,name='shares'),
    path('cash_list/',CashListView.as_view(), name='cash_list'),
    path('shares_list/',SharesListView.as_view(), name='shares_list'),

]
cash_list.html

{% extends 'fx_rates_app/base.html' %}
{% block body_block %}
{% load mathfilters %}


<div class="container">

<table class="table table-bordered">
  <thead>
    <th>Reference</th>
    <th>Amount</th>
    <th>Currency</th>
    <th>Equivalent in GBP</th>
  </thead>

  {% for item in cash_details %}
  {% for ele in fx_list %}

  <tr>
    <td> {{ item.reference }} </td>
    <td> {{ item.amount|floatformat:0|intcomma }} </td>
    <td> {{ item.currency }} </td>

        {% if item.currency == "AUD" %}
        <td>{{ item.amount|div:ele.aud_to_gbp|floatformat:0|intcomma }}</td>

        {% elif item.currency == "EUR" %}
        <td>{{ item.amount|div:ele.eur_to_gbp|floatformat:0|intcomma }}</td>

        {% elif item.currency == "USD" %}
        <td>{{ item.amount|div:ele.usd_to_gbp|floatformat:0|intcomma }}</td>

        {% else %}
        <td> {{ item.amount|floatformat:0|intcomma }} </td>

        {% endif %}

  </tr>

  {% endfor %}
  {% endfor %}


<tr>
  <td> Total </td>
  <td>  </td>
  <td>  </td>
  <td> Total in GBP here</td>
</tr>



  {% endblock %}
  </div>
{%extends'fx\u rates\u app/base.html%}
{%block body_block%}
{%load mathfilters%}
参考文献
数量
通货
等值英镑
{现金中项目的百分比\u详细信息%}
{fx_列表中元素的百分比%}
{{item.reference}}
{{item.amount | floatformat:0 | intcomma}}
{{item.currency}}
{%if item.currency==“AUD”%}
{{item.amount | div:ele.aud_to_gbp | floatformat:0 | intcomma}}
{%elif item.currency==“EUR”%}
{{项目金额| div:ele.eur|u to | gbp | floatformat:0 | intcomma}}
{%elif item.currency==“USD”%}
{{项目金额| div:ele.usd | U to | gbp | floatformat:0 | intcomma}}
{%else%}
{{item.amount | floatformat:0 | intcomma}}
{%endif%}
{%endfor%}
{%endfor%}
全部的
此处总计为英镑
{%endblock%}
提前感谢,,
亚历克斯

我想你可以这样尝试:

from django.db.models import Sum, When, Case, FloatField, Value, F

class CashListView(ListView):
    model = Cash
    context_object_name = 'cash_details'

    def get_context_data(self, **kwargs):
        context = super(CashListView, self).get_context_data(**kwargs)
        latest_fx = fx_table.objects.last()
        queryset = context['cash_details'].annotate(amount_in_gbp=Case(
                When(currency="AUD", then=F('amount')/latest_fx.aud_to_gbp),
                When(currency="USD", then=F('amount')/latest_fx.usd_to_gbp),
                When(currency="EUR", then=F('amount')/latest_fx.eur_to_gbp),
                default=F('amount'),
                output_field=FloatField()
            )
        )
        context['cash_details'] = queryset
        context['total_in_gbp'] = queryset.aggregate(sum=Sum('amount_in_gbp'))['sum']
        return context

# template
{% for item in cash_details %}

  <tr>
    <td> {{ item.reference }} </td>
    <td> {{ item.amount|floatformat:0|intcomma }} </td>
    <td> {{ item.currency }} </td>
    <td> {{ item.amount_in_gbp|floatformat:0|intcomma }} </td>
  </tr>

{% endfor %}

Total: {{ total_in_gbp }}
从django.db.models导入Sum、When、Case、FloatField、Value、F
类CashListView(ListView):
型号=现金
上下文\对象\名称='现金\详细信息'
def获取上下文数据(自身,**kwargs):
context=super(CashListView,self)。获取上下文数据(**kwargs)
latest_fx=fx_table.objects.last()
queryset=context['cash\u details'].注释(金额(单位:英镑=Case(
当(currency=“AUD”,然后=F(“金额”)/最新外汇。澳元兑英镑),
当(currency=“USD”,则=F(“金额”)/最新外汇兑换美元兑英镑),
当(货币=“欧元”,则=F(“金额”)/最新外汇兑换欧元兑英镑),
默认值=F(“金额”),
输出\字段=浮动字段()
)
)
上下文['cash_details']=queryset
上下文['total_in_gbp']=queryset.aggregate(sum=sum('amount_in_gbp'))['sum']
返回上下文
#模板
{现金中项目的百分比\u详细信息%}
{{item.reference}}
{{item.amount | floatformat:0 | intcomma}}
{{item.currency}}
{{item.amount_英镑| floatformat:0 | intcomma}}
{%endfor%}
总计:{{Total_in_gbp}

我用它来总结每种货币的所有价值。

谢谢你的帮助,鲁德拉。我尝试了代码,但出现了以下错误:views.py在get_context_数据中,第29行“dict”对象不可调用。你知道会是什么吗?另外,您在哪里使用了group by?我在
现金总额
中使用了group by。我还修复了错误(很抱歉)。请参阅最新答案,非常感谢。我现在没有收到任何错误,但是html没有显示任何内容。我不应该用你的函数替换我的get\u context\u数据吗?谢谢。然而,当我替换代码并刷新服务器时,html中表格的所有内容都消失了。太棒了!非常感谢你的帮助。它工作得很好。