Wtform 嵌套字段未填充 populate_obj

Wtform nested fields not populated with populate_obj

所以我有这个 DemandeForm 嵌套 FormField:

    AdressePrivee = FormField(AdresseForm, default=AdressePrivee())

Demande型号:

AdressePrivee = db.relationship(AdressePrivee, backref='Demande', lazy=False, uselist=False)

我在 HTML 表单中提交了嵌套字段:

AdressePrivee-RueEtNumero: Boulevard Bonivard 11
AdressePrivee-ComplementNom: 
AdressePrivee-ComplementAdresse: 
AdressePrivee-CasePostale: 01420
AdressePrivee-NPA: 
AdressePrivee-Localite: Seyssel
AdressePrivee-Pays: 2

我这样称呼它:

    form = DemandeForm(data=request.form)

    if form.validate():
        form.populate_obj(demande) # Here, demande.AdressePrivee should be populated
        db.session.add(demande)
        db.session.commit()
        flash('Enregistré', 'success')
        return redirect(url_for('main.index'))

但是如果我在那里打印它,所有条目都设置为 None,好像 demande.AdressePrivee 只等于 AdressePrivee() 空对象(日志:<AdressePrivee None None None>) , 而 FormFields 应该设置, 嵌套字段逻辑, 他们不应该吗?

我是不是漏掉了什么?

我认为你不能直接使用构造函数,你应该使用工厂。

AdressePrivee = FormField(AdresseForm, default=lambda: AdressePrivee())

我也觉得传递请求的表单数据的属性叫“formdata”而不是“data”。

form = DemandeForm(formdata=request.form)

下面是一个对我有用的小例子。

class Address(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    street = db.Column(db.String, nullable=False)

class Inquiry(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String, nullable=False)
    address_id = db.Column(db.Integer,
        db.ForeignKey('address.id', ondelete='cascade'),
        nullable=False
    )
    address = db.relationship('Address', backref='inquiry', lazy=False, uselist=False)


class AddressForm(FlaskForm):
    street = StringField('street', validators=[DataRequired()])

    def __init__(self, csrf_enabled=False, *args, **kwargs):
        super().__init__(csrf_enabled=csrf_enabled, *args, **kwargs)

class InquiryForm(FlaskForm):
    title = StringField('title', validators=[DataRequired()])
    address = FormField(AddressForm, default=lambda: Address())


@app.route('/new', methods=['GET', 'POST'])
def create():
    item = Inquiry()
    form = InquiryForm(request.form)
    if form.validate_on_submit():
        form.populate_obj(item)
        db.session.add(item)
        db.session.commit()

    items = Inquiry.query.all()
    return render_template('create.html', **locals())

祝您在实施项目时取得圆满成功,并希望我能为您提供帮助。