【发布时间】: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