试图在 Jinja2 模板中查找列表的总和
Trying to find sum of a list in a Jinja2 template
我有一个 flask 应用程序,我需要在其中显示投资者的总投资。有3个模型,即Fund、Investor和Investments,它们的定义为:
class Fund(db.Model):
FundID = db.Column(db.Integer, primary_key=True)
FundName = db.Column(db.String(50), unique=True, nullable=False)
UnitPrice = db.Column(db.Float)
def __repr__(self):
return f"Fund('{self.FundName}', '{self.UnitPrice}')"
class Investor(db.Model):
InvestorID = db.Column(db.Integer, primary_key=True)
FirstName = db.Column(db.String(20), nullable=False)
LastName = db.Column(db.String(20), nullable=False)
email = db.Column(db.String(100), unique=True, nullable=False)
fund_value = db.relationship('Investment', backref='Investor')
def __repr__(self):
return f"Investor('{self.InvestorID}','{self.FirstName}')"
class Investment(db.Model):
InvestmentID = db.Column(db.Integer, primary_key=True)
Fund_ID = db.Column(db.Integer, db.ForeignKey('fund.FundID'), nullable=False)
Investor_ID = db.Column(db.Integer, db.ForeignKey('investor.InvestorID'), nullable=False)
Units = db.Column(db.Integer, nullable=False)
Investment_Value = db.Column(db.Integer)
def __repr__(self):
return f'{self.Investment_Value}'
我的投资者页面路径如下:
@app.route("/Investors", methods=['GET','POST'])
def Investors():
Investors = Investor.query.all()
return render_template('Investors.html', title="List of Investors", investors=Investors)
最后,我的模板Investors.html如下:
{% extends "layout.html" %}
{% block content %}
<h1>List of Investors</h1><br/>
<table>
<tr>
<th>Name</th>
<th>Email</th>
<th>Total Investment Value</th>
</tr>
{% for investor in investors %}
<tr>
<td><a class="mr-2" href="{{ url_for('update_investor', Investor_ID=investor.InvestorID) }}">{{ investor.FirstName }} {{ investor.LastName }}</a></td>
<td>{{ investor.email }}</td>
<td>{{ investor.fund_value|sum }}</td>
</tr>
{% endfor %}
</table><br/>
<div>
<a class="btn btn-info" href="{{ url_for('create_investor') }}">Add New Investor</a>
</div>
{% endblock %}
现在,在这个模板中,在最后一个 td 中,我试图找到特定投资者的所有投资的总和并显示它,但是当我使用 {{ investor.fund_value|sum }}它给了我错误“TypeError:+ 不支持的操作数类型:'int' 和 'Investment'”。我在我的 Jinja 模板中通过 运行 循环尝试了这个,但没有帮助。由于我是 Flask 的新手,所以我在这里被困了一段时间,所以感谢任何帮助。
你应该把那种逻辑带到视图上,或者做一个class方法。
更新视图的方法如下:
@app.route("/Investors", methods=['GET','POST'])
def Investors():
Investors = Investor.query.all()
invested_sums = {}
for investor in Investors:
invested_sums[investor.InvestorID] = 0
investments_by_investor = Investment.query.filter_by(Investor_ID=investor.InvestorID)
for investment in investments_by_investor:
invested_sums[investor.InvestorID] += investment.Investment_Value
return render_template('Investors.html', title="List of Investors", investors=Investors, invested_sums=invested_sums)
然后您可以通过InvestorID在您的模板中引用invested_sums。
我有一个 flask 应用程序,我需要在其中显示投资者的总投资。有3个模型,即Fund、Investor和Investments,它们的定义为:
class Fund(db.Model):
FundID = db.Column(db.Integer, primary_key=True)
FundName = db.Column(db.String(50), unique=True, nullable=False)
UnitPrice = db.Column(db.Float)
def __repr__(self):
return f"Fund('{self.FundName}', '{self.UnitPrice}')"
class Investor(db.Model):
InvestorID = db.Column(db.Integer, primary_key=True)
FirstName = db.Column(db.String(20), nullable=False)
LastName = db.Column(db.String(20), nullable=False)
email = db.Column(db.String(100), unique=True, nullable=False)
fund_value = db.relationship('Investment', backref='Investor')
def __repr__(self):
return f"Investor('{self.InvestorID}','{self.FirstName}')"
class Investment(db.Model):
InvestmentID = db.Column(db.Integer, primary_key=True)
Fund_ID = db.Column(db.Integer, db.ForeignKey('fund.FundID'), nullable=False)
Investor_ID = db.Column(db.Integer, db.ForeignKey('investor.InvestorID'), nullable=False)
Units = db.Column(db.Integer, nullable=False)
Investment_Value = db.Column(db.Integer)
def __repr__(self):
return f'{self.Investment_Value}'
我的投资者页面路径如下:
@app.route("/Investors", methods=['GET','POST'])
def Investors():
Investors = Investor.query.all()
return render_template('Investors.html', title="List of Investors", investors=Investors)
最后,我的模板Investors.html如下:
{% extends "layout.html" %}
{% block content %}
<h1>List of Investors</h1><br/>
<table>
<tr>
<th>Name</th>
<th>Email</th>
<th>Total Investment Value</th>
</tr>
{% for investor in investors %}
<tr>
<td><a class="mr-2" href="{{ url_for('update_investor', Investor_ID=investor.InvestorID) }}">{{ investor.FirstName }} {{ investor.LastName }}</a></td>
<td>{{ investor.email }}</td>
<td>{{ investor.fund_value|sum }}</td>
</tr>
{% endfor %}
</table><br/>
<div>
<a class="btn btn-info" href="{{ url_for('create_investor') }}">Add New Investor</a>
</div>
{% endblock %}
现在,在这个模板中,在最后一个 td 中,我试图找到特定投资者的所有投资的总和并显示它,但是当我使用 {{ investor.fund_value|sum }}它给了我错误“TypeError:+ 不支持的操作数类型:'int' 和 'Investment'”。我在我的 Jinja 模板中通过 运行 循环尝试了这个,但没有帮助。由于我是 Flask 的新手,所以我在这里被困了一段时间,所以感谢任何帮助。
你应该把那种逻辑带到视图上,或者做一个class方法。
更新视图的方法如下:
@app.route("/Investors", methods=['GET','POST'])
def Investors():
Investors = Investor.query.all()
invested_sums = {}
for investor in Investors:
invested_sums[investor.InvestorID] = 0
investments_by_investor = Investment.query.filter_by(Investor_ID=investor.InvestorID)
for investment in investments_by_investor:
invested_sums[investor.InvestorID] += investment.Investment_Value
return render_template('Investors.html', title="List of Investors", investors=Investors, invested_sums=invested_sums)
然后您可以通过InvestorID在您的模板中引用invested_sums。