PythonFastAPI:从Jinja2模板中改变输入项的数量

2024-05-13 20:36:17 发布

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

我正在尝试使用Jinja2FastAPI为我的API构建一个简单的web界面(UI)。包含两个输入的UI部分是固定的,但另一部分是动态创建的,方法是使用字典中的键/项填充HTML模板。为简单起见,我使用的字典只有3个键/项,但实际上可能有8个或11个键/项。 我正在努力收集动态生成的输入,因为我不知道如何做到这一点,而不必在代码中硬编码它们的名称。下面是函数中硬编码参数的示例。有没有办法一次收集所有输入,然后以某种方式“解包”它们?我曾考虑将输入放在一个可编辑的表格中,但后来我又在努力收集表格的内容

这是用户界面:

enter image description here

以下是Python代码:

from fastapi import FastAPI, Request, Form
from fastapi.templating import Jinja2Templates

dct = {"ctp_a": 1,
       "ctp_b": 2,
       "ctp_c": 20}

app = FastAPI()
templates = Jinja2Templates(directory="templates/")

@app.get("/form")
def form_post(request: Request):
    result = dct
    return templates.TemplateResponse('form3.html', context={'request': request, 'result': result})

@app.post("/form")
def form_post(
        request: Request, multiply_by: int = Form(...),
        # this is hardcoded which I don't like
        ctp_a_nm: str = Form(...), ctp_b_nm: str = Form(...), ctp_c_nm: str = Form(...),
        # this is hardcoded as well
        ctp_a: int = Form(...), ctp_b: int = Form(...), ctp_c: int = Form(...)
        ):
    
    result = {ctp_a_nm: ctp_a*multiply_by,
              ctp_b_nm: ctp_b*multiply_by,
              ctp_c_nm: ctp_c*multiply_by}
    
    return templates.TemplateResponse('form3.html', context={'request': request, 'result': result})

这是html模板

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Sample Form</title>
    </head>
    <body>
        <form method="post">
            
            <label for="multiply_by">Multiply by</label><br>
            <input type="number" name="multiply_by" value="2"/><br><br>

            {% for key in result %}
                <input type="text" name="{{ key }}_nm" value="{{ key }}" readonly />
                <input type="number" name="{{ key }}" value="{{ result[key] }}"/><br>
            {% endfor %}
            
            <br><input type="submit">
            
        </form>
    </body>
</html>

Tags: keybrforminputbyrequesthtmlctp
1条回答
网友
1楼 · 发布于 2024-05-13 20:36:17

这个答案建立在@MatsLindh在评论中的建议之上

POST请求部分可以这样重写,允许n个键/值

@app.post("/form")
def form_post(
        request: Request,
        multiply_by: int = Form(...),
        name: List[str] = Form(...),
        key: List[int] = Form(...),
        ):
    
    result = dict(zip(name, [k*multiply_by for k in key]))

    return templates.TemplateResponse('form3.html', context={'request': request, 'result': result})

需要更改UI,以便使用唯一的名称引用名称和值

    {% for key in result %}
        <input type="text" name="name" value="{{ key }}" readonly />
        <input type="number" name="key" value="{{ result[key] }}"/><br>
    {% endfor %}

相关问题 更多 >