使用数据库中预先存在的数据编辑SelectMultipleField

时间:2018-12-17 16:35:49

标签: python flask sqlalchemy flask-sqlalchemy

正在构建烧瓶应用程序。我有帖子和标签。发布帖子时,可以为该帖子选择许多标签(就像这里是堆栈溢出一样)。现在,问题出在要编辑帖子的位置。由于已有值,由于重复输入,我得到了sqlalchemy.exc.IntegrityError。我尝试删除重复的条目,然后通过以下方式提交到数据库

post.tags = list(set(post.tags.all()))

,但是它仍然带来相同的错误。这是用于编辑帖子的查看功能:

@home.route('/edit/<int:id>', methods=['GET', 'POST'])
@login_required
def edit_post(id):
    post = Post.query.get_or_404(id)
    if current_user != post.author and not current_user.can(Permission.ADMINISTER):
        abort(403)
    form = PostForm()
    form.tag.choices = [(tag.id, tag.name) for tag in Tag.query.order_by('name')]
    if form.validate_on_submit():
        post.body = form.body.data
        for id in form.tag.data:
            post.tags.append(Tag.query.get(id))
        db.session.commit()
        return redirect(url_for('.view_post', id=post.id))
    form.body.data = post.body
    form.tag.choices = [(tag.id, tag.name) for tag in Tag.query.order_by('name')]
    form.tag.data = post.tags.all()
    return render_template('home/edit_post.html', form=form, title='Edit Post')

请帮助我解决此问题,或为我提供更好的执行建议。考虑我是一个初学者。

1 个答案:

答案 0 :(得分:0)

经过无数次尝试,我能够成功实施编辑。因此,首先我查询了该表中的所有类别,并使用帖子ID(返回元组列表)进行了过滤,例如[[62,1),(62,4)]。元组是(post_id,tag_id)。

categories = db.Table('categories', db.Column('post_id', db.Integer, db.ForeignKey('posts.id'), primary_key=True), db.Column('tag_id', db.Integer, db.ForeignKey('tags.id'), primary_key=True))

然后我自定义了一个元组,我用它来实现if条件,如果该元组存在于类别列表中,则将其忽略,并且仅将唯一的元组提交给数据库。

这是新的视图功能:

@home.route('/edit/<int:id>', methods=['GET', 'POST'])
@login_required
def edit_post(id):
    post = Post.query.get_or_404(id)
    if current_user != post.author and not current_user.can(Permission.ADMINISTER):
        abort(403)

    form = PostForm()
    form.tag.choices = [(tag.id, tag.name) for tag in Tag.query.order_by('name')]

    if form.validate_on_submit():
        post.body = form.body.data
        # query the post-tag relationship for this post id
        posttags = db.session.query(categories).filter_by(post_id=id).all()
        for id in form.tag.data:
            # custom tuple
            if (post.id, id) not in posttags:
                post.tags.append(Tag.query.get(id))
        db.session.commit()
        return redirect(url_for('.view_post', id=post.id))

    form.body.data = post.body
    form.tag.choices = [(tag.id, tag.name) for tag in Tag.query.order_by('name')]
    form.tag.data = post.tags.all()
    return render_template('home/edit_post.html', form=form, title='Edit Post')