Flask + WTForms:使用用户输入的数据编辑现有对象

时间:2018-12-15 20:15:16

标签: flask flask-wtforms

有一种典型的方式是使用烧瓶中的wtforms通过表单编写对象更新。即使存在发布数据,端点函数也会实例化表单。在那种情况下,我不明白为什么表单数据不会被空数据覆盖。请解释逻辑。


使用代表性示例进行更详细的提问:

假设用户提交的有效表单中包含更新的数据,那么我希望表单数据会被

覆盖
form = AlbumEdit(obj=album, original_nome=album.nome)

为什么?由于存在发布数据,因此不会按照wtforms文档https://media.readthedocs.org/pdf/wtforms/2.2.1/wtforms.pdf中的说明运行“ obj = album”,但是表单对象应该收到一个新的(空)BalbEdit实例。

但是很明显,由于帖子数据用于编辑相册对象,所以不会发生这种情况:

form.populate_obj(album) # that works fine

路线:

@app.route('/editalbum/<album_index>', methods=['post','get'])
def editalbum(album_index):
    nome = album_index
    album = Album.query.filter(Album.nome == nome).first()
    form = AlbumEdit(obj=album, original_nome=album.nome)
    if form.validate_on_submit():
        form.populate_obj(album)
        nome = album.nome # different if changed
        db.session.add(album)
        db.session.commit()
        return redirect(url_for('viewalbum', album_index=nome))
    return render_template('album_edit.html', album_index=nome, form=form)

表格:

class AlbumEdit(FlaskForm):
    nome = StringField('Title')
    comentario = StringField('Commentary')

    def __init__(self, original_nome, *args, **kwargs):
        super(AlbumEdit, self).__init__(*args, **kwargs)
        self.original_nome = original_nome

    def validate_username(self, nome):
        if nome.data != self.original_nome:
            album = Album.query.filter(Album.nome == nome.data).first()
            if album is not None:
                raise ValidationError('Please use a different album name.')

0 个答案:

没有答案