使用Jinja在DB表中循环获取错误:“DB名称”未定义

2024-05-13 19:48:24 发布

您现在位置:Python中文网/ 问答频道 /正文

正在使用flask创建web应用程序。正在遵循此教程:https://www.youtube.com/watch?v=dam0GPOAvVI&t=5286s

我的应用程序是一个银行应用程序,与视频中不同。此时,在我的项目中,我已经看完了视频,正在尝试创建一个页面,用户可以在该页面中查看他们在数据库中存储后创建的银行帐户

使用Jinja,我尝试使用for循环来获取与特定用户关联的帐户。在视频中,他们使用了一个非常相似的for循环

{% block content %} <div class="container py-3 p-3 my-3 border">
<h3 style="text-align:Center">Your Accounts</h3>
<form name="banks">
    {% for bank in account.bank_accounts %}
    <label for="banks">Choose an Account</label>
    <select id="banks" name="banks">
        <option> value='{{ x }}'>{{x}}</option>
        {% endfor %}
    </select>
    <div class="form-group">
        <label for="Accounts">Account Number:</label>
    </div>
</form></div>{% endblock %}

但是,我不断遇到错误“jinja2.exceptions.UndefinedError:‘account’未定义”

这是我的银行表和账户表的models.py

class Bank(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.column(db.String(150))
    number = db.Column(db.Integer, unique=True)
    ownership = db.Column(db.String(150))
    type = db.Column(db.String(150))
    amount = db.Column(db.Integer)
    account_id = db.Column(db.Integer, db.ForeignKey('account.id'))

class Account(db.Model, UserMixin): #User object, inherit db from models.py, creating a schema
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(150), unique=True)
    password = db.Column(db.String(150))
    username = db.Column(db.String(150), unique=True)
    bank_accounts = db.relationship('Bank')

我不知道从哪里开始坦白地说,我对制作网络应用相当陌生,在这个项目之前从未使用过flask。在我看来,帐户的定义方式与视频中设置的方式相同

如果您能帮助解决此问题,我们将不胜感激

干杯

编辑:这是my views.py,其中包含路线

@views.route('/accounts', methods=['GET', 'POST'])
@login_required
def accounts():
    return render_template("accounts.html", user=current_user)

是否需要在路线中定义帐户?如果是这样的话,我已经尝试过了,但是我无法使用select()方法。它给了我以下错误:AttributeError:type对象“Bank”没有属性“select”

account = Bank.select(account_id)

Tags: pydividtruefordbstring视频
2条回答

看起来您的User帐户实际上是一个Account对象。如果确实如此,您可以在jinja2模板中使用current_user.bank_accounts

{% block content %} <div class="container py-3 p-3 my-3 border">
<h3 style="text-align:Center">Your Accounts</h3>
<form name="banks">
        <label for="banks">Choose an Account</label>
        <select id="banks" name="banks">
        {% for bank in current_user.bank_accounts %}
            <option value='{{ bank.name }}'>{{ bank.name }}</option>
        {% endfor %}
        </select>

    <div class="form-group">
        <label for="Accounts">Account Number:</label>
    </div>
</form></div>{% endblock %}

据我所知,您已将当前使用的帐户作为“用户”传递给模板。因此,模板中的“帐户”是未知的。
使用以下代码,当前用户应该可以作为模板中的“帐户”使用

@views.route('/accounts', methods=['GET', 'POST'])
@login_required
def accounts():
    return render_template("accounts.html", account=current_user)

但是您也可以在模板中使用current_user。这是一个例外情况,通过global namespace of the jinja environment发生@noslenkwah用一个例子说明了这一点

但是,您在模板中使用了另一个变量“x”,该变量也未定义。这里不能忽视你打算在那里做什么。我假设您希望使用“bank”对象的属性,但我不确定

因为已经定义了关系,所以不一定需要通过select进行查询。可以通过此查询属于“账户”的“银行”类型的对象。正如您在循环中所做的那样。select查询在后台进行。
您可以找到有关数据库关系here的文档

但是,如果您希望从数据库中查询分配给“帐户”的所有“银行”类型的对象,您可以通过以下方式执行此操作

bank_accounts = Bank.query.filter_by(account_id=current_user.id).all()

您可以找到基本数据库查询here的说明


为了确保当前用户也有一个帐户,我建议模板使用以下代码

{% block content %} 
  <div class="container py-3 p-3 my-3 border">
    <h3 style="text-align:center">Your Accounts</h3>
    {% if current_user.bank_accounts %}
    <form name="banks-form">
      <label for="bank">Choose an Account</label>
      <select id="bank" name="bank">
      {% for bank in current_user.bank_accounts %}
        <option value="{{ bank.id }}">{{ bank.name }} - {{ bank.number }}</option>
      {% endfor %}
      </select>
    </form>
    {% else %}
      <p>You have not yet created any accounts.</p>
    {% endif %}
  </div>
{% endblock %}

相关问题 更多 >