首页 > 解决方案 > 如何使用 JinjaTemplates 渲染和过滤字典列表

问题描述

我是 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 脚本。

标签: jinja2fastapi

解决方案


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

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

您正确地将列表数据作为对象的context参数值传递TemplateResponse(FastAPI 在后台使用 Starlette,请参阅此处的文档)。您现在只需要通过指定的键在模板中引用它,即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()函数(→ 请参阅Python 文档)或在模板中使用 Jinja 过滤器。

如果您想使用Jinja2 过滤器来修改模板中传递的数据,您可以利用Jinjas 文档中描述的 Jinja 的许多内置过滤器之一,甚至可以将自己的过滤器函数实现为简单的 Python 函数,如StarletteJinja2 文档中关于创建自定义过滤器


推荐阅读