Flask WTFormsを送信するときに、データベーステーブルからこれらの値を空白にせずに、フィールドを空白のままにするにはどうすればよいですか?

マイケルスコットパーキンス

質問:

私はワット/含むWTForms EditProfileFormフラスコアプリに取り組んでいます:ファーストネームユーザー名、および私について/ wのフォームのロードユーザー名ミーについて自動埋め。は空白です。ユーザーがAboutMe TextAreaFieldを編集したが、FirstNameフィールドとLastNameフィールドを空白のままにした場合、フォームを送信すると、これらのDBフィールドが空白として上書きされます。

関連するコード例:

  • 次のforms.pyコード例ではvalidators=[DataRequired()])、onfirstnameとが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フィールドは自動入力されます。

routers.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-ユーザークラス

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 %}
マイケルスコットパーキンス

結局のところ、問題は、routes.pyedit_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.data4つの分野のうち3つにありました。ドー!

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ