有一种典型的方式是使用烧瓶中的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.')