【问题标题】:Reuse wtforms field in multiple forms在多个表单中重用 wtforms 字段
【发布时间】:2021-07-20 20:20:36
【问题描述】:

我有一堆具有相似字段的表单。为了简化我的代码,我想在表单之外定义字段,然后根据需要将字段添加到表单中,如下所示:

name = wt.StringField("name")
age = wt.StringField("age")

class Form1(FlaskForm):
    name=name

class Form2(FlaskForm):
    age=age

class Form3(FlaskForm):
    name=name
    age=age

这种模式似乎有效,但我以前从未见过有人这样做,所以我想确保没有会破坏这种模式的极端情况。如果是这样,有没有更好的方法来做到这一点?

【问题讨论】:

    标签: python flask flask-wtforms wtforms


    【解决方案1】:

    在我看来,FormField 就是你要找的。​​p>

    class nameForm(Form):
        name = wt.StringField("name")
    
    
    class ageForm(Form):
        age = wt.StringField("age")
    
    
    class Form1(FlaskForm):
        name = FormField(nameForm)
    
    
    class Form2(FlaskForm):
        age = FormField(ageForm)
    
    
    class Form3(FlaskForm):
        name = FormField(nameForm)
        age = FormField(ageForm)
    
    

    这里有一些相关文档 -> https://wtforms.readthedocs.io/en/2.3.x/fields/

    在此文档中搜索字段附件部分

    【讨论】:

    • 你也可以像class Form1(nameForm): pass 那样不使用 FormField。这就是我之前所做的,但我更喜欢我的答案中的解决方案。
    • @gaefan 这是一种巧妙的做法。我已经为验证或填充表单做了类似的事情,但我没有意识到您可以调用返回实际表单字段的函数。很酷的解决方案!
    【解决方案2】:

    虽然我的问题中的模式有效,但我对使用它感到紧张,因为它似乎不是推荐的做事方式。这是一种更安全的方法,可以满足我的需求:

    def name_field(): return wt.StringField("name")
    def age_field(): return wt.StringField("age")
    
    class Form1(FlaskForm):
        name=name_field()
    
    class Form2(FlaskForm):
        age=age_field()
    
    class Form3(FlaskForm):
        name=name_field()
        age=age_field()
    

    【讨论】:

    • 如果我想在这种情况下添加一个新的验证器怎么办。 Form3中的exp添加自定义名称验证器
    猜你喜欢
    • 2021-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    • 1970-01-01
    相关资源
    最近更新 更多