我正在创建一个允许管理员编辑注册用户的UI,我正在努力寻找一个解决方案来更新表中的数据。下面的路由从上一页获取用户id,然后查询填充表单字段,然后我可以编辑这些字段。然后,我有一个'if request method‘,它将表单值分配给查询,然后我想要将该查询提交到数据库。在此之后,它会闪烁一条成功消息,并重定向到用户页面。然而,它似乎只是跳过db会话提交,并闪现成功并执行重定向。
我没有收到任何错误,但是数据库没有更新,就像我更新表单域时没有注册新值一样。
使用的软件包: 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),同样的事情也会发生在上面。我尝试追加,但它给我一个"AttributeError:'scoped_session‘object has no attribute 'append'“错误。
发布于 2021-06-17 22:13:27
非常感谢@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'))
https://stackoverflow.com/questions/68019913
复制相似问题