Mysql
 sql >> Base de données >  >> RDS >> Mysql

Une mise à jour de Flask-SQLAlchemy crée un nouvel enregistrement dans MySQL

D'accord, alors merci à Daniel et Doobeh de m'avoir orienté dans la bonne direction. Fondamentalement, il m'est arrivé de ne pas demander correctement le blog_id dans la méthode POST de edit_entry. Voici le nouveau code (qui fonctionne).

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)

Il s'est avéré qu'il y avait deux problèmes majeurs. Le premier était un oubli :lorsque j'ai copié le modèle edit_entry à partir du modèle new_entry, j'ai oublié de modifier l'action du formulaire, de sorte que le formulaire publiait réellement sur la route new_entry, d'où la duplication. Après avoir trouvé ce problème, j'ai également réalisé que même si blog_id était passé dans request.args à la méthode 'GET', il n'était pas passé dans la méthode 'POST' (puisque le message ne provenait pas de la redirection), donc J'ai en fait créé un nouveau champ dans le modèle edit_entry pour renvoyer le blog_id à POST.