代码之家  ›  专栏  ›  技术社区  ›  Karsten

wtforms动态增值

  •  3
  • Karsten  · 技术社区  · 9 年前

    我正在开发一个将WTForms与模板引擎结合使用的应用程序。

    显示给用户的表单不是预先定义的,但可以由管理员动态配置。因此WTForm需要能够动态添加字段,我通过指定Form的这个子类实现了这一点( as suggested by ):

    class DynamicForm(Form):
    @classmethod
    def append_field(cls, name, field):
        setattr(cls, name, field)
        return cls
    

    这很好,但似乎通过此方法,您无法通过Form(obj=values_here)填充字段。这是我当前对上述Form子类的实例化:

    values = {}
    values['password'] = 'Password123'
    
    form = DynamicForm(obj=values)
    form.append_field("password", PasswordField('password'))
    

    所以这是行不通的,当您考虑将字段添加到表单的 初始化 已调用。因此,我一直在寻找一种动态分配字段值的方法,但到目前为止,我还没有运气。

    有人知道将示例中的密码字段设置为某个值的方法吗?非常感谢。

    2 回复  |  直到 7 年前
        1
  •  2
  •   dkol Timmy O'Mahony    9 年前

    试试看:

    >>> form = DynamicForm().append_field('password',
                                          PasswordField('password'))(
                                              password="Password123")
    >>> form.data
    {'password': 'Password123'}
    
        2
  •  0
  •   Karsten    9 年前

    dkol在这里提到的解决方案就像一个符咒,但它确实需要你知道字段的名称(换句话说,它无法计算)。这是因为您传递的命名参数的键 (password="Password123") 不能是表达式或变量。这意味着这样的for循环不起作用:

    form = DynamicForm()
    
    for field in fields:
        form = form.append_field(field.label, StringField(field.label))(field.label=field.value)
    

    因此,在对dkol提供的前一种解决方案进行了一些修改后,我想到了这个:

    form = DynamicForm()
    
    class formReferenceObject:
        pass
    
    for field in fields:
        form = form.append_field(field.label, StringField(field.label))
        setattr(formReferenceObject, field.label, field.value)
    
    form = form(obj=formReference)
    

    这个解决方案可能需要更多的代码,但仍然非常可读,非常灵活。因此,当使用for循环/计算 <input /> name,这对你有帮助。