新的SO,我希望我的问题是相关的,符合规则。
我正在尝试python微框架Flask;到现在为止还挺好。鉴于以下2个实体(一个Truc到多个TrucAttribute):
特鲁克:
from app import db
from sqlalchemy.orm import relationship
from sqlalchemy import Table, Column, Integer, ForeignKey
import TrucAttribute
class Truc(db.Model):
__tablename__ = 'app_truc'
id = db.Column(db.Integer, prymary_key = True)
owned_attributs_de_truc = db.relationship('TrucAttribute', backref="truc", cascade="all, delete-orphan", lazy="dynamic")
# Truc business methods ...
TrucAttribute:
from app import db
from sqlalchemy.orm import relationship
from sqlalchemy import Table, Column, Integer, ForeignKey
import Truc
class TrucAttribute(db.Model):
id = db.Column(db.Integer, primary_key=True)
truc_id = db.Column(db.Integer, db.ForeignKey('app_truc.id'))
truc_owner = relationship("Truc", backref="attributs_de_truc")
@staticmethod #return a list usable for forms
def form_list():
attributs = TrucAttributes.query.all()
attributs_list = []
for attribut in attributs:
attributs_list.append((unicode(attribut.id), unicode(attribut.name))
return attributs_list
forms.py:
from flask_wtf import Form
from wtforms import SelectField
from app.models.trucAttributes import TrucAttribute
class CreateTrucForm(Form):
truc_attribute = SelectField(u'Truc Attribute', choices=TrucAttribute.form_list())
来自create.html的代码:
Truc Attribute :
{{ form.truc_attribute() }}
和控制器:
@app.route('/create/truc', methods=['GET', 'POST'])
def createTruc():
form = CreateTrucForm()
return render_template('create/CreateTruc.html', form=form)
如何使用TrucAttribute的选择列表创建Truc创建表单?到目前为止,我只根据Flask Mega Tutorial创建了非常简单的表单。
谢谢!
答案 0 :(得分:0)
你的静态方法应该绝对没问题。我唯一不确定的是这个解决方案的动态性。如果您最终添加或删除TrucAttribute,它会更新吗?如果仅在启动时查询它可能不会。我做的有点不同,在调用render_template之前在app.route函数中使用它。那么您不需要在表单类中定义choices = ...
form.truc_attribute.choices = [(a.id,a.name) for a in Session.query(TrucAttribute).\
order_by(TrucAttribute.a_name).all()]
render_template(.....)
但是你的静态方法应该可以正常工作。我喜欢按字母顺序排序我的选择并使用order_by来做到这一点。
另一个提示。如果你想让表单返回相应的id整数而不是用户选择的字符串,从而简化你的查询,你可以在你的表单类中设置:
class CreateTrucForm(Form):
truc_attribute = SelectField("Attribute", coerce=int)
然后按照我刚才描述的方式填充列表,在发布请求后解析表单时,应该让intergers返回。
希望这会有所帮助。
哈努哈利