[英]How do I bind an flask-wtform UnboundField?
我正在創建一個將產品發布到市場的應用程序。 該市場上的每個產品類別的產品屬性都有不同的形式,例如,如果是電子產品,則存在電壓,型號等字段。我可以通過市場服務器上的json獲取此信息。 首先,用戶必須輸入產品的名稱及其主要類別,然后市場服務器預測自己的類別並返回其屬性。 這是響應示例:
{
"id": "MODEL",
"name": "Modelo",
"tags": {
"hidden": true
},
{
"id": "PACKAGE_LENGTH",
"name": "Comprimento da embalagem",
"tags": {
"hidden": true,
"read_only": true,
"variation_attribute": true
},
"hierarchy": "ITEM",
"relevance": 2,
"value_type": "number_unit",
"value_max_length": 255,
"allowed_units": [
{
"id": "km",
"name": "km"
},
{
"id": "polegadas",
"name": "polegadas"
},
{
"id": "ft",
"name": "ft"
},
{
"id": "mm",
"name": "mm"
},
{
"id": "m",
"name": "m"
},
{
"id": "\"",
"name": "\""
},
{
"id": "in",
"name": "in"
},
{
"id": "cm",
"name": "cm"
}
],
"default_unit": "cm",
"attribute_group_id": "OTHERS",
"attribute_group_name": "Outros"
}
到現在為止還挺好。
現在,我需要創建一個動態表單,以便能夠添加/編輯這些字段,因為每個類別都有不同的屬性類型和數量。 每個字段都需要有一個ID,一個類型(只能是字符串,或者只能是數字),一個標簽以及一個最大長度(如果其value_type number_unit需要一個具有給定單位的SelectField)。
我正在一個視圖中獲取此信息,並且在同一視圖中,我創建了FlaskForm的子類,在其中我根據屬性的類型創建了字段列表。
class DynamicForm(PostProductForm):
loaded_attr = json.loads(meli.get(f"/categories/{category}/attributes").content.decode('utf-8'))
attribute_fields = []
for attribute in loaded_attr:
tags = attribute.get('tags')
if not tags.get('read_only'):
if attribute.get('value_type') == 'number_unit':
attribute_fields.append(IntegerField(
attribute['name'], validators=[Length(min=0, max=attribute['value_max_length'])]))
allowed_units = [(unit['id'], unit['name']) for unit in attribute['allowed_units']]
attribute_fields.append(SelectField('Unidade', choices=allowed_units))
elif attribute['value_type'] == 'string':
attribute_fields.append(StringField(
attribute['name'], validators=[Length(min=0, max=attribute['value_max_length'])]))
elif attribute['value_type'] == 'number':
attribute_fields.append(IntegerField(
attribute['name'],
validators=[Length(min=0, max=attribute['value_max_length'])]))
elif attribute['value_type'] == 'boolean':
attribute_fields.append(BooleanField(attribute['name']))
但這會創建一堆UnboundFields。 如果我嘗試僅渲染每個字段代表,它將顯示以下內容:
<UnboundField(StringField, ('SKU ',), {'validators': [<wtforms.validators.Length object at 0x04DFBEF0>]})>
如果我嘗試渲染該字段,則會給我一個例外:
TypeError: 'UnboundField' object is not callable
我正在遍歷模板內的列表。
{% for attribute in form.attribute_fields %}
<div class="form-group blocked">
{{ attribute() }}
</div>
{% endfor %}
如何綁定UnboundField?
要使用wtforms創建動態表單,請使用以下模板
def DynamicForm(*args, **kwargs):
class StaticForm(FlaskForm):
pass
if args[0] == True:
StaticForm.class_attrib1 = StringField(...)
else:
StaticForm.class_attrib2 = StringField(...)
return StaticForm()
這將在函數的本地范圍內建立一個StaticForm,根據來自函數參數的編程邏輯附加所有相關項,並返回實例化形式:
form = DynamicForm(True)
# form has attribute: class_attrib1
在某處的文檔中對此進行了解釋,但是我現在找不到鏈接
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.