[英]Flask WTForms SelectField Create choices from api data
我正在從這樣傳遞的 api 中提取信息:
{
"Location": {
"Units": [
{
"id": 1,
"Item": [
{
"Description": "some string value",
"ID": "some string value"
},
{
"Description": "some string value",
"ID": "some string value"
},
{
"Description": "some string value",
"ID": "some string value"
}
]
},
{
"id": 2,
"Item": [
{
"Description": "some string value",
"ID": "some string value"
},
{
"Description": "some string value",
"ID": "some string value"
},
{
"Description": "some string value",
"ID": "some string value"
}
]
}
]
}
}
我正在提供一個帶有 select 字段的 wtform:
forms.py
class ReserveForm(Form):
item = SelectField(
'Item',
choices=[],
coerce=int
)
我將“Unit.id”的 ID 作為 url 變量傳遞給我的路線:
應用程序.py
@app.route('/reserve/<id>')
def reserve(id):
data = *my api data in json format*
form = ReserveForm()
return render_template('reserve.html', data=data, form=form)
在我看來,我正在打印表格:
<form action="" method="POST">
{{ form.hidden_tag() }}
{{ form.item.label() }}
{{ form.item() }}
</form>
我需要做的是使用 ID 與 url 變量中的 ID 相匹配的“Unit”中的“Item”作為 select 字段的選項。
我無法找到一種在模板級別向字段添加選項的方法,而這將是我的首選方法。 就像是:
<form action="" method="POST">
{{ form.hidden_tag() }}
{{ form.item.label() }}
{{ form.item(choices=[data.Location.Unit[specific-ID].item]) }}
</form>
我寄希望於找到這樣的解決方案,因為我最熟悉 Jinja2。
由於我找不到實現該功能的方法,因此我一直在嘗試弄清楚如何在路線中創建選擇字段選項。 這篇文章很有幫助: 動態選擇 WTForms Flask SelectField
但是我的數據結構不同,因為有一個額外的嵌套層。
我想我做對了,通過循環遍歷“單位”以找到 ID 與我的變量匹配的那個,並將該“單位”分配給一個變量。 然后我可以像上面鏈接的帖子一樣,使用循環的鍵值(我不知道這叫什么或它是如何工作的,所以我無法搜索它是如何工作的):
@app.route('/reserve/<id>')
def reserve(id):
data = *my api data in json format*
for item in data['Location']['Unit']:
if item['ID'] == id:
unit = item
items = [(item['ID'], item['Description']) for item in unit['Item']]
form = ReserveForm()
form.item.choices = items
return render_template('reserve.html', data=data, form=form)
我很確定這會起作用,但我收到錯誤消息“alueError:以 10 為基數的 int() 的無效文字:”
顯然密鑰需要是 integer,而不是字符串。 問題在於 api 數據中的描述和 ID 都是字符串,而 ID 是字母/數字組合,無法轉換為 integer。
我需要描述作為 select 字段選項的顯示文本,我需要值作為 ID 字符串。
如果我沒有 integer ID,我可以使用什么作為密鑰? 如果我不能使用 ID 字符串作為鍵,名稱和值如何應用於 select 字段選項? 我假設鍵是 select 字段值。
**更新:我用數字“1”替換了項目['ID']:
items = [(1, item['Description']) for item in unit['Item']]
現在頁面正在呈現,select 字段正在工作,但所有 select 字段值都設置為“1”:
<option value="1">item name from api data</option>
該值需要是 api 數據中的項目 ID,如下所示:
'ID': 'babb87d5-323f-4d56-9ed0-e2b643a78936'
但不可能使用字符串作為值。 任何意見,將不勝感激。
我通過在我的字段設置中將 coerce 設置為 int 來強制使用 int 值。 coerce 的默認值是 unicode。一旦我更改了該字段,就會按預期填充。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.