首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Jinja2 FastAPI:来自Python模板的不同数量的输入项

Jinja2 FastAPI:来自Python模板的不同数量的输入项
EN

Stack Overflow用户
提问于 2021-09-01 09:59:57
回答 1查看 334关注 0票数 0

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

这是UI:

以下是Python代码:

代码语言:javascript
运行
复制
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模板。

代码语言:javascript
运行
复制
<!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>
EN

Stack Overflow用户

回答已采纳

发布于 2021-09-01 11:35:14

这个答案基于@MatsLindh在评论中的建议。

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

代码语言:javascript
运行
复制
@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。

代码语言:javascript
运行
复制
    {% for key in result %}
        <input type="text" name="name" value="{{ key }}" readonly />
        <input type="number" name="key" value="{{ result[key] }}"/><br>
    {% endfor %}
票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69011629

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档