簡體   English   中英

Flask WTForms SelectField 從 api 數據創建選擇

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM