如何在Flask中创建涉及多个实体的表单?

时间:2017-02-16 12:22:18

标签: python flask sqlalchemy

新的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创建了非常简单的表单。

谢谢!

1 个答案:

答案 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返回。

希望这会有所帮助。

哈努哈利