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

以下是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>发布于 2021-09-01 11:35:14
这个答案基于@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 %}https://stackoverflow.com/questions/69011629
复制相似问题