在 flask-wtforms 中自动设置表单元素的 id HTML 属性
Automatically setting the id HTML attribute of a form element in flask-wtforms
有没有办法自动将表单输入元素本身的 id
设置为表单名称 和 字段变量的名称?即对于 FooForm
实例中的 bar
字段,id
将是 foo-form--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
编辑:抱歉完全错过了关于 id
是自动的部分,然后子类化是必要的,一个简单的方法是:
def AdjStringField(form_name, **kwargs):
name = kwargs.get('name', 'Bar')
return wtf.StringField(name, render_kw={
'id': f'{}{}'.format(form_name, name.lower(),
**kwargs.get('render_kw', {})})
class FooForm(FlaskForm):
form_name = class_id(__qualname__)
bar = AdjStringField(form_name)
pipe = AdjStringField(form_name, name='Pipe', render_kw={'foo': 'bar'})
您可以为任何输入字段类型重载它,前提是您在参数对象中提供它:
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'})
有没有办法自动将表单输入元素本身的 id
设置为表单名称 和 字段变量的名称?即对于 FooForm
实例中的 bar
字段,id
将是 foo-form--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
编辑:抱歉完全错过了关于 id
是自动的部分,然后子类化是必要的,一个简单的方法是:
def AdjStringField(form_name, **kwargs):
name = kwargs.get('name', 'Bar')
return wtf.StringField(name, render_kw={
'id': f'{}{}'.format(form_name, name.lower(),
**kwargs.get('render_kw', {})})
class FooForm(FlaskForm):
form_name = class_id(__qualname__)
bar = AdjStringField(form_name)
pipe = AdjStringField(form_name, name='Pipe', render_kw={'foo': 'bar'})
您可以为任何输入字段类型重载它,前提是您在参数对象中提供它:
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'})