Python Flask SQLalchemy更新当前用户

Python Flask SQLalchemy更新当前用户,python,flask,sqlalchemy,flask-sqlalchemy,Python,Flask,Sqlalchemy,Flask Sqlalchemy,如何更新Flask SQLAlchemy数据库中当前用户的名字和姓氏 我尝试使用基于flask sqlalchemy文档的以下代码-但是,它只提交电子邮件字段的更新,而不更新firstname或lastname字段的记录 # views.py @users.route("/account", methods=['GET', 'POST']) @login_required def account(): form = UpdateUserForm() if form.valid

如何更新Flask SQLAlchemy数据库中当前用户的名字和姓氏

我尝试使用基于flask sqlalchemy文档的以下代码-但是,它只提交电子邮件字段的更新,而不更新firstname或lastname字段的记录

# views.py
@users.route("/account", methods=['GET', 'POST'])
@login_required
def account():

    form = UpdateUserForm()

    if form.validate_on_submit():

        current_user.firstname = form.firstname.data
        current_user.lastname = form.lastname.data
        current_user.email = form.email.data

        db.session.commit()
        return redirect(url_for('users.account'))

    elif request.method == 'GET':
        form.firstname.data = current_user.firstname
        form.lastname.data = current_user.lastname
        form.email.data = current_user.email

    return render_template('account.html', form=form)

对不起,我找不到错误。下面的代码适合我。即使对你来说没有真正的区别,也值得一试

class UpdateUserForm(FlaskForm):
    email = StringField(
        'Email',
        validators=[
            # InputRequired is deprecated and replaced by DataRequired
            DataRequired(message = 'Enter a valid email'),
            Email()
        ]
    )
    firstname = StringField(
        'First Name',
        validators=[
            DataRequired(message = 'Enter your first name')
        ]
    )
    lastname = StringField(
        'Last Name',
        validators=[
            DataRequired(message = 'Enter your last name')
        ]
    )
    submit = SubmitField('Update')

    def validate_email(self, email):
        if User.query.filter_by(email=email.data).first():
            raise ValidationError('This email has been registered already!')

{{form.csrf_token}
{{form.email.label()}
{{form.email(class='form-control')}
{%if form.email.errors:%}
{{form.email.errors[0]}
{%endif%}
{{form.firstname.label()}}
{{form.firstname(class='form-control')}
{%if form.firstname.errors:%}
{{form.firstname.errors[0]}
{%endif%}
{{form.lastname.label()}}
{{form.lastname(class='form-control')}
{%if form.lastname.errors:%}
{{form.lastname.errors[0]}
{%endif%}
{{form.submit(class='btn btn primary')}

谢谢您的帮助!能够解决我的问题,包括以下更新忽略电子邮件提交,如果它是不变的(我认为它被认为是一个重复的记录,并防止唯一的价值)。这个小小的增加似乎解决了问题

def validate_email(self,email):
     if User.query.filter_by(email=email.data).first() and email.data != current_user.email:
          raise ValidationError('Email has been already been registered.')

乍一看,您当前的代码是正确的。能否将模板的代码添加到问题中?添加了模板和model.py。谢谢你的帮助!唯一性,不改变价值,当然我没有想到。干得好。
# Model.py
class User(db.Model, UserMixin):
    __tablename__ = 'users'
    id = db.Column(db.Integer,primary_key=True)
    selected_theme = db.Column(db.String(64),nullable=False,default='default')
    email = db.Column(db.String(64),unique=True,index=True)
    fullname = db.Column(db.String(64))
    firstname = db.Column(db.String(64))
    lastname = db.Column(db.String(64))
    password_hash = db.Column(db.String(128))

    def __init__(self,email,fullname,password, firstname, lastname):
        self.email = email
        self.fullname = fullname
        self.firstname = firstname
        self.lastname = lastname
        self.password_hash = generate_password_hash(password)

    def check_password(self,password):
        return check_password_hash(self.password_hash,password)

    def __repr__(self):
        return f"Username {self.username}"
class UpdateUserForm(FlaskForm):
    email = StringField(
        'Email',
        validators=[
            # InputRequired is deprecated and replaced by DataRequired
            DataRequired(message = 'Enter a valid email'),
            Email()
        ]
    )
    firstname = StringField(
        'First Name',
        validators=[
            DataRequired(message = 'Enter your first name')
        ]
    )
    lastname = StringField(
        'Last Name',
        validators=[
            DataRequired(message = 'Enter your last name')
        ]
    )
    submit = SubmitField('Update')

    def validate_email(self, email):
        if User.query.filter_by(email=email.data).first():
            raise ValidationError('This email has been registered already!')
    @users.route("/account", methods=['GET', 'POST'])
    @login_required
    def account():
        # You can forward your current data to the form here
        form = UpdateUserForm(request.form, obj=current_user)
        if form.validate_on_submit():
            current_user.firstname = form.firstname.data
            current_user.lastname = form.lastname.data
            current_user.email = form.email.data
            db.session.commit()
            return redirect(url_for('users.account'))
        return render_template('account.html', **locals())
<form method="POST">
    {{ form.csrf_token }}
    <div class="form-group">
        {{ form.email.label() }}
        {{ form.email(class='form-control') }}
        {% if form.email.errors: %}
        <div class="invalid-feedback">
            {{ form.email.errors[0] }}
        </div>
        {% endif %}
    </div>
    <div class="form-group">
        {{ form.firstname.label() }}
        {{ form.firstname(class='form-control') }}
        {% if form.firstname.errors: %}
        <div class="invalid-feedback">
            {{ form.firstname.errors[0] }}
        </div>
        {% endif %}
    </div>
    <div class="form-group">
        {{ form.lastname.label() }}
        {{ form.lastname(class='form-control') }}
        {% if form.lastname.errors: %}
        <div class="invalid-feedback">
            {{ form.lastname.errors[0] }}
        </div>
        {% endif %}
    </div>
    {{ form.submit(class='btn btn-primary') }}
</form>
def validate_email(self,email):
     if User.query.filter_by(email=email.data).first() and email.data != current_user.email:
          raise ValidationError('Email has been already been registered.')