【问题标题】:How to make dropdown list change a table data with Jinja2 + Flask如何使用 Jinja2 + Flask 使下拉列表更改表格数据
【发布时间】:2018-02-12 17:13:50
【问题描述】:

我正在使用 Jinja2 模板为我的 Motor Racing webapp 动态更改结果表。这并不完美,但我正在耐心等待。

我有一个由 URL 'webapp.com/driver/' 呈现的模板,该模板应该显示赛车手出现在表格中的比赛结果。说清楚:

  1. 用户选择一个驱动程序并转到 webapp.com/driver/someDriver
  2. someDriver 页面有一个下拉列表,其中包含 someDriver 经历过的所有比赛
  3. 用户从下拉列表中选择 someRace
  4. 表格由 someRace 的结果提供

我为它写的python烧瓶路线:

@app.route('/driver/<driverid>')
def driver(driverid):
    driver = db.Drivers.find_one({'_id': ObjectId(driverid)})
    races = db.Races.find({'finalresult.driver':driver['unique_name']}).sort([('timestamp', -1)])
    racesList = []
    for race in races:
        raceItem = {
            'filename':race['filename'],
            'date':datetime.datetime.fromtimestamp(float(race['timestamp'])).strftime('%d-%m-%Y'),
            'finalresult':race['finalresult'],
            'id':str(race['_id'])}

        racesList.append(raceItem)
    return render_template('user.html', driver=driver, racesList=racesList)

现在我正在尝试制作一个动态模板,每次用户更改选择时都会更改结果表。

<div class="row">
    <form name="racesForm">
        <label for="selRace">Escolha uma corrida!</label>
        <select class="form-control" id="selRace">
            {% for race in racesList %}
            <option value="{{race.filename}}">
                {{race.filename}}
            </option>
            {% endfor %}
        </select>
    </form>
    <hr>
</div>

<div class="row">
    <table>
        <thead>
        <th>Position</th>
        <th>Driver</th>
        </thead>
        <tbody>
        <tr>
            {% position, drivername in race.finalresult %}
            <th>{{position}}</th>
            <td>{{drivername}}</td>
            {% endfor %}
        </tr>
        </tbody>
    </table>
</div>

但现在我收到一个错误:

Encountered unknown tag 'position'.

就是这样..我不确定如何让这个下拉列表动态更改表格。任何见解都会受到赞赏。

更新//提供更多信息: Driver 是一个非常简单的 dict/json,它有两个键 ['name'] 和 ['_id']

racesList 是一个包含许多“raceItem”的数组。

每个“raceItem”都有一个关键的“finalresult”,其中包含每个车手完成的位置数据。

这个数组充满了许多对象,看起来像下面的例子:

'finalresult': [
{'position': 1,
'drivername': 'John Doe'},
'position': 2,
'drivername': 'Foo Bazz', etc
}]

正如我之前所说,我希望这些数据显示在表格中,具体取决于从“raceList”下拉列表中选择的 RACE。

作为一种解决方案,我正在考虑创建一个新路由...但我希望此路由显示在同一页面中。我不希望用户被引导到新窗口。

【问题讨论】:

  • 可能没有所选驱动程序的记录?在这种情况下,请参阅stackoverflow.com/a/34839762/2196316 以检查密钥是否在对象中...通过在运行应用程序的本地控制台中记录/打印数据来进行调试,以检查来自 Mongo 的响应集..
  • 你忘记了'for'声明:{% position, drivername in race.finalresult %},你不能那样使用它。使用{% for position in race.finalresult %}
  • race.finalresult 中的race 是什么? Races 集合的结构是什么?您必须在发布问题时提供所有详细信息。
  • 我刚刚用更多信息更新了这个问题。很抱歉让你一直没有消息
  • 伙计们,我发现也许正确的方法是创建一个 POST 路由并使表单能够 POST 数据。你怎么看?

标签: python-3.x flask jinja2


【解决方案1】:

首先,您会得到Encountered unknown tag 'position',因为您使用的是不同的数据结构。正如你提到的finalresultlistdicts。因此,您需要在填充表格时对其进行迭代。

{% for driver_stat in race.finalresult %}
    <td>{{driver_stat.position}}</td>
    <td>{{driver_stat.drivername}}</td>
{% endfor %}

但是使用您的方法,当您从下拉列表中选择不同的种族时,该表格不会动态更新。相反,我建议使用jquery。因此,您不必导航到另一个页面来显示驱动程序统计信息。我发现了几个有用的 SO 问题,这些问题已经得到了回答。关注他们。

参考:

【讨论】:

  • 感谢查马斯!我使用一点 AngularJS 作为客户端编码。我觉得它比 jquery/AJAX 简单一点。无论如何,我对如何使用动态 URL 感到非常困惑。我的意思是,当我在烧瓶代码上设置它时,它完全容易理解。问题是在 AngularJS 中使用 $http 函数时。我不确定如何使用动态路由,这让我感觉非常糟糕。谢谢你的努力。我会继续学习的。
猜你喜欢
  • 2022-01-12
  • 1970-01-01
  • 1970-01-01
  • 2011-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多