使 WTForms 从数据库模型设置字段标签
Make WTForms set field label from database model
我有三个表:组件、属性和attribute_values。每个组件可以有多个attribute_values。每个 attribute_value 属于一个 属性 。是的,这是可怕的 EAV 模式...
我创建了这两种形式:
class AttributeValueForm(Form):
attribute = HiddenField()
value = StringField('Value')
class ComponentForm(Form):
... non-related fields left out ...
attribute_values = FieldList(FormField(AttributeValueForm))
这些是 SQLAlchemy 模型:
class Component(db.Model):
__tablename__ = 'components'
id = db.Column(db.Integer, primary_key=True)
... non-related columns left out ...
class AttributeValue(db.Model):
__tablename__ = 'attribute_values'
id = db.Column(db.Integer, primary_key=True)
value = db.Column(db.String)
attribute_id = db.Column(db.Integer, db.ForeignKey('attributes.id'))
attribute = db.relationship('Attribute', backref='attribute_values'))
component_id = db.Column(db.Integer, db.ForeignKey('components.id'))
component = db.relationship('Component', backref='attribute_values'))
def Attribute(db.Model):
__tablename__ = 'attributes'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(60))
我的问题是我希望将属性的 name 视为值字段的标签(替换 'Value')。我一直在努力了解 WTForms 的内部工作方式,但我看不到任何明显的方法。
感谢任何提示。如果我只能在呈现值字段时获取 AttributeValue 对象,我什至可以使用仅呈现自定义标签的 hack。
您可以考虑使用 wtforms-alchemy
中的 ModelForm
您可以很容易地使用模型定义表单。
类似于:
class AttributeValueForm(ModelForm):
class Meta:
model = Attribute
only = (... columns that you want to include ...)
好的,所以我想出了一个解决方案,它有点类似于 adarsh 对他的回答的第二条评论,但是覆盖了 FormField 使用的表单的 init:
class AttributeValueForm(Form):
value = StringField('Unnamed attribute')
def __init__(self, *args, **kwargs):
super(AttributeValueForm, self).__init__(*args, **kwargs)
if 'obj' in kwargs and kwargs['obj'] is not None:
self.value.label.text = kwargs['obj'].attribute.name
我有三个表:组件、属性和attribute_values。每个组件可以有多个attribute_values。每个 attribute_value 属于一个 属性 。是的,这是可怕的 EAV 模式...
我创建了这两种形式:
class AttributeValueForm(Form):
attribute = HiddenField()
value = StringField('Value')
class ComponentForm(Form):
... non-related fields left out ...
attribute_values = FieldList(FormField(AttributeValueForm))
这些是 SQLAlchemy 模型:
class Component(db.Model):
__tablename__ = 'components'
id = db.Column(db.Integer, primary_key=True)
... non-related columns left out ...
class AttributeValue(db.Model):
__tablename__ = 'attribute_values'
id = db.Column(db.Integer, primary_key=True)
value = db.Column(db.String)
attribute_id = db.Column(db.Integer, db.ForeignKey('attributes.id'))
attribute = db.relationship('Attribute', backref='attribute_values'))
component_id = db.Column(db.Integer, db.ForeignKey('components.id'))
component = db.relationship('Component', backref='attribute_values'))
def Attribute(db.Model):
__tablename__ = 'attributes'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(60))
我的问题是我希望将属性的 name 视为值字段的标签(替换 'Value')。我一直在努力了解 WTForms 的内部工作方式,但我看不到任何明显的方法。
感谢任何提示。如果我只能在呈现值字段时获取 AttributeValue 对象,我什至可以使用仅呈现自定义标签的 hack。
您可以考虑使用 wtforms-alchemy
中的ModelForm
您可以很容易地使用模型定义表单。
类似于:
class AttributeValueForm(ModelForm):
class Meta:
model = Attribute
only = (... columns that you want to include ...)
好的,所以我想出了一个解决方案,它有点类似于 adarsh 对他的回答的第二条评论,但是覆盖了 FormField 使用的表单的 init:
class AttributeValueForm(Form):
value = StringField('Unnamed attribute')
def __init__(self, *args, **kwargs):
super(AttributeValueForm, self).__init__(*args, **kwargs)
if 'obj' in kwargs and kwargs['obj'] is not None:
self.value.label.text = kwargs['obj'].attribute.name