【问题标题】:Flask sql-alchemy commit not updating user tableFlask sqlalchemy 提交不更新用户表
【发布时间】:2021-06-17 13:00:10
【问题描述】:

我正在创建一个 UI 以允许管理员编辑注册用户,我正在努力寻找一种解决方案来更新我的表中的数据。下面的路线从上一页获取用户 ID,然后查询填充表单字段,然后我可以对其进行编辑。然后我有一个“如果请求方法”,它将表单值分配给我想要提交到数据库的查询。在此之后,它会闪烁一条成功消息并重定向到用户页面。但是,它似乎只是跳过了 db session 提交,并闪烁成功并执行重定向。

我没有收到任何错误,但数据库没有更新,就像我更新表单字段时它没有注册新值一样。

正在使用的包:Flask SQLALchemy、Flask WTForms。数据库是 MySQL。

routes.py

@admin.route('/admin/edituser/<int:id>', methods=['GET', 'POST'])
@login_required
def edituser(id):
    if current_user.is_admin:
        edituserform =  EditUserForm(request.form)
        user_query = User.query.filter_by(id=id).first()

        edituserform.email.data = user_query.email
        edituserform.first_name.data = user_query.first_name
        edituserform.last_name.data = user_query.last_name
        edituserform.is_admin.data = user_query.is_admin
        edituserform.company_name.data = user_query.company_name

        if request.method == 'POST' and edituserform.validate_on_submit:
            user_query.email = edituserform.email.data
            user_query.first_name = edituserform.first_name.data
            user_query.last_name = edituserform.last_name.data
            user_query.is_admin = edituserform.is_admin.data
            user_query.company_name = edituserform.company_name.data

            db.session.commit()
            flash('User has been updated')
            return redirect(url_for('admin.adminusers'))

        return render_template('/admin/edituser.html', title='Edit User', edituserform=edituserform, user_query=user_query)

    return redirect(url_for('store.viewstore'))

forms.py

class EditUserForm(FlaskForm):
    email = StringField('Email', validators=[DataRequired(), Email()])
    first_name = StringField('First Name', validators=[DataRequired()])
    last_name = StringField('Last Name', validators=[DataRequired()])
    company_name = QuerySelectField('Select Company', query_factory=lambda:Company.query.all(), get_label="customer_id")
    is_admin = BooleanField('Admin Account?')
    save_user_button = SubmitField('Save Changes')

编辑:只是补充一下,我在提交之前尝试了 db.session.add(user_query) 和 db.session.merge(user_query) 并且发生了与上面相同的事情。我尝试 db.session.append,它给了我一个“AttributeError:'scoped_session'对象没有属性'append'”错误。

【问题讨论】:

  • 我认为您从未更改任何内容,因为您首先将editeruserform.email.data 分配给userquery.email,然后将userquery.email 分配给您在上面定义的editoruserform.email.data。顺便说一句,我不完全确定。
  • @charchit 这很有趣,我想因为第二部分包含在一个 if 语句中,当 post 操作发生时,userquery.email 将被替换为表单字段中的任何内容(因为这会改变)。根据其他帖子和各种 youtube 搜索,我的印象是我所拥有的应该可以工作,但显然情况并非如此!
  • 在定义这些edituserform.email.data = user_query.email ....a时使用if request.method == get
  • @charchit 添加 if....get: sqlalchemy.exc.DataError:
  • 你能编辑导致这个错误的代码吗?主要在哪一行。

标签: python flask flask-sqlalchemy


【解决方案1】:

非常感谢@charchit 没有您的意见,我无法解决这个问题。 您对使用 if request.method == 'GET' 的建议显然是我在尝试使用表单中的更改更新现有数据时陷入的循环所需要的。

我查看了引发的新错误。我的User 表中的company_name 是一个单独表的外键,所以我想当我试图更新表时,它试图将一个字符串添加到一个整数中。所以我将company_name 数据放入一个单独的变量中,然后使用该变量附加关系。

然后就是合并数据db.session.merge(user_query)的简单案例。下面是完整的代码,它可能有点笨拙,但它现在可以工作了!再次,非常感谢您的帮助,我生活中没有多少人可以与我讨论这些问题,所以有时它只是帮助从其他人那里获得想法。

routes.py

@admin.route('/admin/edituser/<int:id>', methods=['GET', 'POST'])
@login_required
def edituser(id):
    if current_user.is_admin:
        edituserform =  EditUserForm(request.form)
        user_query = User.query.filter_by(id=id).first()

        if request.method == 'GET':
            edituserform.email.data = user_query.email
            edituserform.first_name.data = user_query.first_name
            edituserform.last_name.data = user_query.last_name
            edituserform.is_admin.data = user_query.is_admin
            edituserform.company_name.data = user_query.company_name
            
        if request.method == 'POST' and edituserform.validate_on_submit:
            user_query.email = edituserform.email.data
            user_query.first_name = edituserform.first_name.data
            user_query.last_name = edituserform.last_name.data
            user_query.is_admin = edituserform.is_admin.data

            company_assign = edituserform.company_name.data # Variable that pulls the company data from the form
            company_assign.user.append(user_query) # Appending the relationship
            db.session.merge(user_query) # Merging the new data with the existing data
            db.session.commit()
            flash('User has been updated')
            return redirect(url_for('admin.adminusers'))

        return render_template('/admin/edituser.html', title='Edit User', edituserform=edituserform, user_query=user_query)

    return redirect(url_for('store.viewstore'))

【讨论】:

    猜你喜欢
    • 2017-08-01
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    • 2014-10-01
    • 2021-12-26
    • 2019-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多