Ok, então obrigado a Daniel e Doobeh por me apontar as direções certas. Basicamente, eu não estava solicitando o blog_id corretamente no método POST de edit_entry. Aqui está o novo (e funcionando) código.
def edit_entry():
form = BlogEntry()
if request.method == 'POST':
blog_id = request.form.get('blog_id')
update = db.session.query(models.Blog).filter_by(id = blog_id).update({
'title': request.form.get('title'),
'content': request.form.get('content')
})
db.session.commit()
return redirect(url_for('blog'))
elif request.method == 'GET':
blog_id = int(request.args['blog_id'])
post = models.Blog.query.filter_by(id = blog_id).first_or_404()
context = {
'copyright': COPYRIGHT,
'form': form,
'blog_id': blog_id
}
form.title.data = post.title
form.content.data = post.content
return render_template('edit_entry.html', **context)
Acabaram surgindo dois grandes problemas. Punho foi um descuido:quando copiei o template edit_entry do template new_entry, esqueci de alterar a ação do formulário, então o formulário estava realmente postando na rota new_entry, daí a duplicação. Depois de encontrar esse problema, também percebi que, embora blog_id fosse passado em request.args para o método 'GET', ele não estava sendo passado no método 'POST' (já que o post não vinha do redirecionamento), então Na verdade, criei um novo campo no modelo edit_entry para passar o blog_id de volta ao POST.