Python 如何绑定一个未绑定字段?
我正在创建一个将产品发布到市场的应用程序。该市场上的每个产品类别都有不同的产品属性形式,例如,如果是电子产品,则有电压、型号等字段。。。 我通过marketplace服务器通过json获得这些信息。 首先,用户必须写下产品的名称及其主要类别,marketplace服务器预测他们自己的类别并将其属性返回给我。 下面是一个响应示例:Python 如何绑定一个未绑定字段?,python,flask,jinja2,flask-wtforms,dynamicform,Python,Flask,Jinja2,Flask Wtforms,Dynamicform,我正在创建一个将产品发布到市场的应用程序。该市场上的每个产品类别都有不同的产品属性形式,例如,如果是电子产品,则有电压、型号等字段。。。 我通过marketplace服务器通过json获得这些信息。 首先,用户必须写下产品的名称及其主要类别,marketplace服务器预测他们自己的类别并将其属性返回给我。 下面是一个响应示例: { "id": "MODEL", "name": "Modelo", "tags": { "hidden": true }, { "id": "PACKAGE_LE
{
"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、一个类型(可以是字符串,也可以是数字)
标签、最大长度以及其值是否为“类型编号”单位需要一个带有给定单位的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']))
但这会创建一组未绑定的字段。如果我尝试仅渲染每个字段repr,它会显示以下内容:
<UnboundField(StringField, ('SKU ',), {'validators': [<wtforms.validators.Length object at 0x04DFBEF0>]})>
我在模板内循环浏览列表
{% for attribute in form.attribute_fields %}
<div class="form-group blocked">
{{ attribute() }}
</div>
{% endfor %}
{%for form.attribute_fields%}
{{attribute()}}
{%endfor%}
如何绑定未绑定字段?要使用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
这在文档的某个地方解释过,但我现在找不到相关的链接(可能)=>我读过这个问题,但我的问题是我在创建时只有字段ID。在此线程中,OP创建了另一个具有定义字段的类(书名)。在我的例子中,一些类别只有一个或两个字段,但其他类别有更多字段。每个类别都有不同类型的字段。我想知道的是,如果可以的话,是否可以使用json文件提供的信息来创建这些字段。是的,这是可能的,但我建议你使用javascript来实现这一点。是否可以混合使用wtforms和javascript?我是否能够使用相同的语法访问表单数据?e、 g:form.attribute.data您可能需要使用一些技巧,您需要添加一个隐藏字段(不是HiddenField类),然后将所有javascript字段以类似json的格式放入其中,然后您可以访问该隐藏字段的数据和处理,我不确定这是否是最好的选择,但它比您现在所做的更好
form = DynamicForm(True)
# form has attribute: class_attrib1