我是使用 FastAPI 和 Python 的 Chameleon 新用户。 我在模板中有以下代码片段:
${ag.name}在 python 代码中,我有一个类定义为:
class AgeGroupInfo: def init (self,名称:str,检查:str): self.name = 姓名 self.checked = check
视图字典包含 AgeGroupInfo 对象的列表(不是精确的 python 语法,但您可以看到“name”和“checked”的值) : [('Preschool', ' '), ('Child', ' '), ('Teen', ' '), ('Adult', 'checked')]
模板被处理成一个网页此来源:
<fieldset>
<legend>Age Group:</legend>
<input name="age_group" type="radio" id="${ag.name}" value="${ag.name}" >
<label for="Preschool">Preschool</label>
<input name="age_group" type="radio" id="${ag.name}" value="${ag.name}" >
<label for="Child">Child</label>
<input name="age_group" type="radio" id="${ag.name}" value="${ag.name}" >
<label for="Teen">Teen</label>
<input name="age_group" type="radio" id="${ag.name}" value="${ag.name}" checked >
<label for="Adult">Adult</label>
</fieldset>
在某些情况下,${ag.name} 会被正确替换(在“标签”HTML 语句中),但在其他情况下则不会。 ${ag.checked} 的一次使用确实得到了正确的替换。
关于为什么替换在某些情况下有效但在其他情况下无效的任何提示?
问题在于没有明确地告诉 Chameleon 想要对列表进行迭代。正在传递一个包含元组的列表,但 Chameleon 并不知道希望将每个元组视为一个单独的
ag
对象。
为了解决这个问题,需要使用 Chameleon 的循环结构。以下是如何修改的代码以使其正常工作:
1. 在的 Python 代码中:
from fastapi import FastAPI, Request
from fastapi.responses import HTMLResponse
from chameleon import engine
app = FastAPI()
@app.get("/", response_class=HTMLResponse)
async def root(request: Request):
template = engine.load_template("template.html")
age_groups = [
AgeGroupInfo('Preschool', ''),
AgeGroupInfo('Child', ''),
AgeGroupInfo('Teen', ''),
AgeGroupInfo('Adult', 'checked'),
]
return template.render(age_groups=age_groups)
2. 在的 Chameleon 模板 (template.html) 中:
<fieldset>
<legend>Age Group:</legend>
{% for ag in age_groups %}
<input name="age_group" type="radio" id="${ag.name}" value="${ag.name}" ${ag.checked}>
<label for="${ag.name}">${ag.name}</label>
{% endfor %}
</fieldset>
解释:
-
{% for ag in age_groups %}
和{% endfor %}
: 这些标签告诉 Chameleon 遍历age_groups
列表中的每个项目。 -
ag
: 在循环的每次迭代中,ag
变量将代表列表中的一个AgeGroupInfo
对象。 -
${ag.name}
和${ag.checked}
: 现在,这些表达式将在循环的每次迭代中正确地替换为ag
对象的相应属性值。
通过这些更改,的 Chameleon 模板将能够正确地迭代
age_groups
列表,并为每个年龄组生成带有正确值 (
name
和
checked
) 的 radio button。