烧瓶wtforms QuerySelectFeld form.populate_obj字段未填充,如果填写错误,则引发翻译转换

问题描述 投票:0回答:1

我在两个问题上苦苦挣扎,

1 / QuerySelectField未填充

2 /如果填写字段则翻译错误

我正在使用添加功能和编辑功能“从wtforms_alchemy.fields import QuerySelectField”允许在下拉列表中从一个数据库模型中进行选择。在“ addboilercircuit”功能中,此功能有效,在表单中显示了一个下拉列表,我可以提交该表单。在“ editboilercircuit”功能中,我正在使用formpopulate_obj填充所有字段,接受QuerySelectField,下拉列表可见,但如果选择其中一个,则不会显示已保存的选择,并且然后提交我得到一个translate错误消息。这是我的代码:

form.py

def boiler_ID():
    return Boilers.query

class AddBoilerCircuitForm(FlaskForm):
    name = StringField('Name', validators=[DataRequired()])
    boiler_ID = QuerySelectField('Boiler_ID',
                    query_factory=boiler_ID,
                    get_label='id')
    submit = SubmitField('Register')

models.py

class Boilers(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64))
    state = db.Column(db.String(9))

    def __repr__(self):
        return '<Boilers {}>'.format(self.id)

class Boilercircuit(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64))
    boiler_ID = db.Column(db.String(30))

    def __repr__(self):
        return '<Boilercircuit {}>'.format(self.id)

boilers.py

@bp.route('/boilers/editboilercircuit/<int:id>', methods=('GET', 'POST')) 
@login_required
def editboilercircuit(id):
    obj = Boilercircuit.query.get(id) or Boilers()
    form = AddBoilerCircuitForm(request.form, obj=obj)
    if form.validate_on_submit():
        form.populate_obj(obj)
        db.session.add(obj)
        db.session.commit()
        flash('Congratulations, you are have updated a Boiler Circuit!')
        return redirect(url_for('boilers.boilercircuits'))
    return render_template('boilers/editboilercircuit.html', title= 'edit boilercircuit',
                          form=form, obj=obj)

和htmleditboilercircuit.html

  <h2>Edit Boiler Circuit</h2>
      <form action="" method="post">
      {{ form.hidden_tag() }}
          <div>{{ form.name.label }} {{ form.name(class="input") }}</div>
          <div>{{ form.boiler_ID.label }} {{ form.boiler_ID(class="input") }}</div>
          <div>{{ form.submit(class="submit") }}</div>
     <form>

错误消息是

AttributeError:“锅炉”对象没有属性“翻译”

在“ addboilercircuit”函数上运行良好,在我的视图函数中接受,我必须向每个QuerySelectField添加str以避免出现“翻译错误”,这是我的代码

def addboilercircuit():
    form = AddBoilerCircuitForm()
    if form.validate_on_submit():
        boilercircuit = Boilercircuit(name=form.name.data,
                boiler_ID=str(form.boiler_ID.data), #here I have added "str"

我已经在所有论坛中搜索了类似的问题,但大多数都与添加功能有关,这帮助我清理了我的代码(谢谢@sean)和许多其他代码。我希望我的问题很清楚在此先感谢

保罗

python flask-wtforms wtforms
1个回答
0
投票

这里要考虑的关键是,由ORM支持的字段实际上处理的是ORM对象,而不是处理的表单字段的值的标量值。证据是在可调用查询中传递给QuerySelectField构造函数:

def boiler_ID():
    return Boilers.query

这是一个返回Boiler实例而不是整数ID值的查询。

要对其进行排序,请在名为relationship的模型上添加一个boiler字段,并将您的表单字段与此相关联。我们还需要在boilercircuit.boiler_ID上添加外键,以便该关系可以建立boilers表的联接路径。

# adds a `ForeignKey` constraint to `boiler_ID` and a `boiler` 
# relationship to your `BoilerCircuit` object.

class Boilercircuit(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64))
    boiler_ID = db.Column(db.String(30), db.ForeignKey("boilers.id"))

    boiler = db.relationship("Boilers")

    def __repr__(self):
        return '<Boilercircuit {}>'.format(self.id)

然后修改表格:

# renames the `boiler_ID` field to `boiler` and also the field's label.
class AddBoilerCircuitForm(FlaskForm):
    name = StringField('Name', validators=[DataRequired()])
    boiler = QuerySelectField('boiler',
                    query_factory=boiler_ID,
                    get_label='id')
    submit = SubmitField('Register')

您还需要在整个视图和模板中更改对AddBoilerCircuitForm.boiler_ID的所有引用,因为该字段不再存在于表单中。

© www.soinside.com 2019 - 2024. All rights reserved.