提交Flask WTForms时,如何将字段保留为空白而又不从数据库表中删除这些值?

问题描述 投票:1回答:2

问题:

我正在使用带有WTForms EditProfileForm的Flask应用程序,其中包含:名字姓氏用户名关于我。表单加载带有用户名关于我的自动填充。 名字为空白。如果用户编辑“关于我” TextAreaField,但将“名”和“姓”字段留为空白,则提交表单会将这些DB字段覆盖为空白。

相关代码示例:

  • 在下面的[[forms.py代码示例中,我在validators=[DataRequired()])firstname上有lastname,但是由于这些字段显示为空白,因此要求用户重新输入他们的他们想编辑任何字段时都可以使用名字和姓氏。所以我删除了那些验证器。

  • 还有名字和姓氏,还有一个用户名验证功能,因此,如果用户不更改其用户名,该用户名必须是唯一的,则在提交时查询不会返回假阳性错误,即用户名必须为独特。

forms.py-EditProfileForm类:

class EditProfileForm(FlaskForm): firstname = StringField('First Name') lastname = StringField('Last Name') username = StringField('Username', validators=[DataRequired()]) about_me = TextAreaField('About Me', validators=[Length(min=0, max=140)]) submit = SubmitField('Submit') def __init__(self, original_username, *args, **kwargs): super(EditProfileForm, self).__init__(*args, **kwargs) self.original_username = original_username def validate_username(self, username): if username.data != self.original_username: user = User.query.filter_by(username=self.username.data).first() if user is not None: raise ValidationError('Please choose a different username.')
    我在“视图”功能中找不到导致firstnamelastname字段显示为空白,但会自动填充usernameabout_me字段的任何内容。
  • routes.py-edit_profile

  • 视图@app.route('/edit_profile', methods=['GET', 'POST']) @login_required def edit_profile(): form = EditProfileForm(current_user.username) if form.validate_on_submit(): current_user.firstname = form.firstname.data current_user.lastname = form.lastname.data current_user.username = form.username.data current_user.about_me = form.about_me.data db.session.commit() flash(_('Your changes have been saved.')) return redirect(url_for('edit_profile')) elif request.method == 'GET': form.username.data = current_user.firstname form.username.data = current_user.lastname form.username.data = current_user.username form.about_me.data = current_user.about_me return render_template('edit_profile.html', title=_('Edit Profile'), form=form)

    models.py-User

    class User(UserMixin, db.Model): id = db.Column(db.Integer, primary_key=True) firstname = db.Column(db.String(50), index=True) lastname = db.Column(db.String(50), index=True) username = db.Column(db.String(50), index=True, unique=True) email = db.Column(db.String(120), index=True, unique=True) password_hash = db.Column(db.String(128)) about_me = db.Column(db.String(140)) def __repr__(self): return '<User {}>'.format(self.username) def set_password(self, password): self.password_hash = generate_password_hash(password) def check_password(self, password): return check_password_hash(self.password_hash, password)

    edit_profile.html

    {% extends "base.html" %} {% import 'bootstrap/wtf.html' as wtf %} {% block app_content %} <h1>Edit Profile</h1> <div class="row"> <div class="col-md-4"> {{ wtf.quick_form(form) }} </div> </div> {% endblock %}
    python validation flask-wtforms auto-populate
    2个回答
    1
    投票
    只需插入简单的if逻辑。

    if form.firstname.data: current_user.firstname = form.firstname.data if form.lastname.data: current_user.lastname = form.lastname.data

    如果用户无法编辑/更改username,为什么将其创建为可编辑字段?最好将其作为隐藏字段并传递数据。

    在我看来,您的表格不一致。为什么自动填充某些字段而不填充其他字段?

    如果用户是新用户,并且您是第一次收集数据,则所有字段都应为空白且可编辑。

    如果要编辑的表单详细信息,则所有字段均应自动填充,并且用户名应隐藏,因为您说他不能更改它。


    0
    投票
    原来,问题是我在routes.py edit_profile视图函数中犯了一个简单的复制/粘贴错误。我有这个...

    form.username.data = current_user.firstname form.username.data = current_user.lastname form.username.data = current_user.username form.about_me.data = current_user.about_me

    我在四个字段中的三个中有form.username.data。 h! 
    © www.soinside.com 2019 - 2024. All rights reserved.