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>
) , 而 FormField
s 应该设置, 嵌套字段逻辑, 他们不应该吗?
我是不是漏掉了什么?
我认为你不能直接使用构造函数,你应该使用工厂。
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())
祝您在实施项目时取得圆满成功,并希望我能为您提供帮助。
所以我有这个 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>
) , 而 FormField
s 应该设置, 嵌套字段逻辑, 他们不应该吗?
我是不是漏掉了什么?
我认为你不能直接使用构造函数,你应该使用工厂。
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())
祝您在实施项目时取得圆满成功,并希望我能为您提供帮助。