Python 自动设置表单中表单元素的id HTML属性

Python 自动设置表单中表单元素的id HTML属性,python,flask,flask-wtforms,Python,Flask,Flask Wtforms,是否有一种方法可以自动将表单输入元素本身的id添加到表单名称和字段变量名称中?i、 e.对于FooForm实例中的bar字段,id将是FooForm--bar 我目前正在使用这种方法来实现这一点,但它有点麻烦: from flask_wtf import FlaskForm import wtforms as wtf class FooForm(FlaskForm): FORM_NAME = 'foo-form' bar = wtf.StringField('Bar', re

是否有一种方法可以自动将表单输入元素本身的
id
添加到表单名称和字段变量名称中?i、 e.对于
FooForm
实例中的
bar
字段,
id
将是
FooForm--bar

我目前正在使用这种方法来实现这一点,但它有点麻烦:

from flask_wtf import FlaskForm
import wtforms as wtf

class FooForm(FlaskForm):
    FORM_NAME = 'foo-form'
    bar =  wtf.StringField('Bar', render_kw={'id': f'{FORM_NAME}--bar'})

我认为子类化使这变得复杂,因为子类只包含一行或两行。您可以执行以下操作:

def class_id(s):
    """Convert input string from PascalCase to kebab-case"""
    import re
    return re.sub(r'(?<!^)(?=[A-Z])', '-', s).lower() + '-'

class MyClass(object):
    form_name = class_id(__qualname__)
    print(f"{form_name}attribute")

class OtherClass(object):
    form_name = class_id(__qualname__)
    print(f"{form_name}attribute")

>>> MyClass()
>>> OtherClass()
my-class-attribute
other-class-attribute
您可以为任何输入字段类型重载此字段,前提是您将其作为参数对象提供:

def AdjField(Field, form_name, **kwargs):
    name = kwargs.get('name', 'Bar')
    return Field(name, render_kw={
        'id': f'{}{}'.format(form_name, name.lower(),
        **kwargs.get('render_kw', {})})

>>> AdjField(wtf.StringField, 'form-name')
>>> AdjField(wtf.InputBox, 'other-name', name='Pipe', render_kw={'foo': 'bar'})

您可能可以将FlaskForm和/或StringField子类化,然后在那里执行。@KenKinder感谢您的建议,我将试一试:-)感谢您的建议,不知您是否可以在
FlaskForm
子类中重载某些方法,因为我们不希望对每个字段类型都执行重载操作?我们还希望检查
render\u kw
是否未被完全覆盖…编辑后,您自己的
render\u kw
将被包括在内,并在“id”键重叠的情况下占主导地位
def AdjField(Field, form_name, **kwargs):
    name = kwargs.get('name', 'Bar')
    return Field(name, render_kw={
        'id': f'{}{}'.format(form_name, name.lower(),
        **kwargs.get('render_kw', {})})

>>> AdjField(wtf.StringField, 'form-name')
>>> AdjField(wtf.InputBox, 'other-name', name='Pipe', render_kw={'foo': 'bar'})