首页 > 解决方案 > 如何在 wtforms Flask 中覆盖名称

问题描述

新的.html

{{ form.particular(name='particular[]') }}

我尝试使用上面的代码在输入字段中分配名称,但出现以下错误。但是,如果我添加一个类或 id 替换名称(例如: {{ form.particular(id='particulars') }} )它可以工作,但不适用于 name 只会输出以下错误:

builtins.TypeError TypeError: html_params
() 为关键字参数“名称”获取了多个值

任何解决方案。先感谢您 :)

标签: pythonflaskflask-wtforms

解决方案


当您定义表单时:

class WebForm(FlaskForm):
    particular = StringField('some_description')

然后你有一个字段name=particular,它是 wtforms 的基础功能。因此,当您尝试这样做form.particular(name='particular[]')时,会出现多值错误,因为您无法在 jinja2 模板中重新定义名称。

您以两种方式之一覆盖名称(请注意,在 jinja2 渲染发生之前,两者都是服务器端):

1)静态:即定义一个新名称:

class WebForm(FlaskForm):
    particular_new = StringField('some_description')

2)动态:即一个包装函数创建一个修正的静态形式:

def WebForm(new_name):
    class TempForm(FlaskForm):
        pass
    setattr(TempForm, new_name, StringField('some_description'))
    return TempForm()
# will create a WebForm with attribute name of 'new_name' as StringField

推荐阅读