Flask下拉列表与数据库同步问题解决记录

刚开始 我的表单是这么写的

forms.py:

tags = Tag.query.all()

class MovieForm(FlaskForm):
    """电影表单"""
    tag_id = SelectField(
        label="标签",
        validators=[DataRequired("请选择标签")],
        description="标签",
        coerce=int,
        choices=[(v.id, v.name) for v in tags],
        render_kw={"class": "form-control"}
    )

在表单类之外 先执行 查询标签的 动作 tags = Tag.query.all(),但是我发现我在另外一个页面添加标签成功之后,返回在电影添加页面 进行tag选取时,下拉框中出现的内容并没有刚才新添加的tag,
怀疑是tags = Tag.query.all()这条语句并没有被调用

在网上搜索尝试后 解决方法如下:

class MovieForm(FlaskForm):
    """电影表单"""
    tag_id = SelectField(
        label="标签",
        validators=[DataRequired("请选择标签")],
        description="标签",
        coerce=int,
        render_kw={"class": "form-control"}
    )

    def __init__(self, *args, **kwargs):
        super(MovieForm, self).__init__(*args, **kwargs)
        self.tag_id.choices = [(v.id, v.name) for v in Tag.query.all()]

通过__init__()方法 初始化tag_id.choices,这样就可以实现下拉框与数据库同步了

还有另外一种直接下拉选择设定的值,然后将选择的值读取存储
代码如下:

class MovieForm(FlaskForm):
    star = SelectField(
            label="星级",
            validators=[DataRequired("请选择星际")],
            description="星级",
            coerce=int,
            choices=[(1, "1星"), (2, "2星"), (3, "3星"), (4, "4星"), (5, "5星")],
            render_kw={"class": "form-control"})

发表评论

电子邮件地址不会被公开。