簡體   English   中英

如何在FormField中使用Flask / WTForms中的populate_obj?

[英]How to use populate_obj in Flask / WTForms with a FormField?

我有一個位置用戶。 正如概念證明一樣,Location是CombinedForm中的FormField,應該存儲為用戶模型。 最終我想擁有相當多的嵌套表單,所以我真的很喜歡form.populate_obj(Model)來處理數據。 但是,我一定是做錯了。 這是我的代碼:

# - - - Models - - -
class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer(), primary_key=True)
    username = db.Column(db.String(40))
    location = db.relationship('Location', backref='user')

class Location(db.Model):
    __tablename__ = 'locations'
    id = db.Column(db.Integer(), primary_key=True)
    user_id = db.Column(db.Integer(), db.ForeignKey('users.id'))
    descr = db.Column(db.String(50))

# - - - Forms - - -
class LocationForm(NoCsrfForm):
    descr = StringField('Location Name')

class CombinedForm(Form):
    username = StringField('User', validators=[DataRequired()])
    location = FormField(LocationForm)  # , default=lambda: Location())
    submit = SubmitField('Submit')

# - - - Routes - - -
@app.route('/', methods=['GET', 'POST'])
def index():
    user = User(username="not in db")
    form = CombinedForm(obj=user)
    if form.validate_on_submit():
        form.populate_obj(user)
        db.session.add(user)
        db.session.commit()
    return render_template('multi.html', form=form)

當我將user.location = [Location(descr="Test")]到索引函數時,我可以在我的視圖中使用{{ form.location }}渲染字段,但是對表單中字段的更改沒有對模型的影響,因為populate_obj不會使用POST數據填充Location對象。 當FormField在FieldList中時,填充它是有效的。

我錯過了什么?

我沒有找到沒有FieldList的工作FormField示例。

我花了很多時間在這上面,甚至在我認為我已經弄明白的時候做了一個例子 ,但我錯了,至少在沒有FieldList的情況下使用帶有populate_list的FormField時。 如果有更好的方法來處理一個表格中的2-3個模型的數據,請告訴我。 我瘋了所以我真的很感激一些幫助。 謝謝你的時間。

看起來我的頭腦里真的混淆了,關系錯了。 以下示例有效。

請注意,如果您確實將對象(如User實例)傳遞給表單,則必須已填充該位置。 如果您傳遞的用戶沒有位置,則populate_obj無法在提交時從表單中找到新位置。

有辦法嗎?

這應該作為FormField概念證明:

# - - - Models - - -
class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer(), primary_key=True)
    username = db.Column(db.String(40))
    location_id = db.Column(db.Integer, db.ForeignKey('locations.id'))


class Location(db.Model):
    __tablename__ = 'locations'
    id = db.Column(db.Integer(), primary_key=True)
    descr = db.Column(db.String(50))
    users = db.relationship('User', backref='location')


# - - - Forms - - -
class LocationForm(NoCsrfForm):
    descr = StringField('Location Name')


class CombinedForm(Form):
    username = StringField('User', validators=[DataRequired()])
    location = FormField(LocationForm, default=lambda: Location())
    submit = SubmitField('Submit')


# - - - Routes - - -
@app.route('/', methods=['GET', 'POST'])
def index():
    user = User(username="Def")
    form = CombinedForm()  # don't put a user obj in unless it has a location!
    if form.validate_on_submit():
        form.populate_obj(user)
        db.session.add(user)
        db.session.commit()
    return render_template('multi.html', form=form)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM