【问题标题】:How to render and filter a list of dictionnaries using JinjaTemplates如何使用 Jinja 模板呈现和过滤字典列表
【发布时间】:2021-05-20 09:35:50
【问题描述】:

我是 Fast-API 和 Jinja2 的新手。

我正在寻找通过 Jinja2Template html 页面呈现和过滤列表的正确方法。

我开发了这个 Fast-API:

# Imports 
from fastapi import FastAPI, Request

# Environment
app = FastAPI()
templates = Jinja2Templates(directory="static")

# Routes & endpoints
@app.get("/")
async def get_records(request : Request):
    my_list = [
        {"a": "foo", "b":"bar"},
        {"a": "foo1", "b":"bar1"},
        {"a": "foo2", "b":"bar2"},
    ]
    return templates.TemplateResponse("items.html", {"request" : request, "my_list" : mylist})

# Main thread
if __name__ == "__main__":
    uvicorn.run(app, host='0.0.0.0', port=42)

我也开始编写我的 ./static/items.html

{% extends "base.html" %}
{% block head %}
{{ super() }}
{% endblock %}

{% block page_content %}
<div>
  Hello team
</div>

# Here is where I want my list mylist to be render with the possibility filter 
{% endblock %}

正如我所说,我对 Fast-API 还很陌生,但我没有在 https://fastapi.tiangolo.com/advanced/templates/ 上找到管理它的方法。

你能帮我找到方法吗?我很确定我必须编写一个 JS 脚本。

【问题讨论】:

    标签: jinja2 fastapi


    【解决方案1】:

    这是我希望我的列表 mylist 使用可能性过滤器呈现的地方

    我不确定您要达到什么目的,无论如何,这是我根据两种可能的解释得出的答案。无论哪种方式,您都不一定必须使用 JavaScript。

    您正确地将列表数据作为TemplateResponse 对象的context 参数值传递(FastAPI 在后台使用Starlette,请参阅docs here)。 您现在只需要在模板中通过指定的键引用它,即my_list

    https://jinja.palletsprojects.com/en/3.0.x/templates/

    {% extends "base.html" %}
    {% block head %}
    {{ super() }}
    {% endblock %}
    
    {% block page_content %}
    <div>
      {{ my_list }}
    </div>
    

    如果您只想显示某些项目,即过滤掉其中一些项目,您可以使用标准 Python 在视图方法中执行此操作,例如使用内置 filter() 函数(→ 参见 @ 987654323@) 或在模板中使用 Jinja 过滤器。

    如果您想使用 Jinja2 过滤器 来修改模板中传递的数据,您可以利用 Jinjas documentation 中描述的 Jinja 的许多内置过滤器之一,甚至可以将自己的过滤器函数实现为简单的 Python功能如StarletteJinja2 docs on creating custom filters 中所述。

    【讨论】:

    • 嘿!非常感谢您的回答。我要试试这两个选项。我正在寻找的是一种为示例呈现 500 个项目的方法,然后过滤这些项目以获取键“a”包含值“foo”的项目(例如)。我相信函数 .filter 有这个功能:)
    • 不客气!如果它符合您的目的,您可以投票或选择我的答案作为解决方案。在您的情况下,我会选择 Python 的内置函数 filter():您只需向它传递一个函数,该函数为您希望在结果列表中包含的每个项目返回 Truefiltered_items = filter(lambda x: x.get("a") == "foo", original_list)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-11
    • 2021-06-11
    • 2021-05-18
    • 2021-06-30
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    相关资源
    最近更新 更多