Q&A
実現したいこと
flaskでwtf-formを用いて、フォームを作成しています。
現在、ユーザー情報の更新を行うルーティングを作成しています。ユーザー情報の更新を行うページで、jinjaテンプレートを用いてhtmlのinputタグにレンダリングされる部分にvalue属性を付与したいと考えています。以下、ダラダラと質問内容の詳細を書いていますが、結論としてはwtf-formでvalue属性を使う方法を教えていただきたいです。よろしくお願いします。
前提
flask-wtfを使わない書き方であれば、目的の表示を行うことができます。以下に、htmlタグで直接書いたパターン(成功しているパターン)とflask-wtfで書いたパターン(失敗しているパターン)を示します。
[ファイル構成]
(該当ファイルのみ、成功しているパターンと失敗しているパターンのどちらもファイル構造は同じです。)
C:. │ app.py │ └─templates admin-userupdate.html
成功しているパターン
python
1###該当する部分のコードのみ載せています。### 2 3#フォームクラス 4class RegisterForm(FlaskForm): 5 username = StringField('名前') 6 email = EmailField('メールアドレス') 7 password = PasswordField('パスワード') 8 calender = StringField('カレンダーのタグ') 9 room = URLField('ミーティングのリンク') 10 submit = SubmitField('登録') 11 12#ユーザーテーブル 13class User(UserMixin, db.Model): 14 __tablename__ = 'User' 15 id = db.Column(db.Integer, primary_key=True) 16 username = db.Column(db.String(100), nullable=False) 17 email = db.Column(db.String(100), nullable=False, unique=True) 18 password = db.Column(db.String(100), nullable=False) 19 calender = db.Column(db.String(1000), nullable=False) 20 room = db.Column(db.String(1000), nullable=False) 21 def __init__(self, username, email, password, calender, room): 22 self.username = username 23 self.email = email 24 self.password = password 25 self.calender = calender 26 self.room = room 27 28with app.app_context(): 29 db.create_all() 30 31#該当のルーティングのみ載せています。 32@app.route('/<int:id>/update', methods=['GET', 'POST']) 33def adminuserupdate(id): 34 if 'login' in session: 35 #特定のid番号の情報を取得 36 user = User.query.get(id) 37 if request.method == 'POST': 38 #上書き 39 user.username = request.form.get('username') 40 user.email = request.form.get('email') 41 user.calender = request.form.get('calender') 42 user.room = request.form.get('room') 43 db.session.commit() 44 return redirect('/admin') 45 else: 46 return render_template('admin-userupdate.html', user=user)
html
1#該当箇所のみ載せています。 2<h1>編集画面</h1> 3<form method="POST"> 4 <label for="usrename">ユーザー名</label> 5 <input type="text" name="username" value={{ user.username }}> 6 <label for="email">Email</label> 7 <input type="email" name="email" value={{ user.email }}> 8 <label for="calender">カレンダーのタグ</label> 9 <input type="text" name="calender" value={{ user.calender }}> 10 <label for="room">ルームのURL</label> 11 <input type="url" name="room" value={{ user.room }}> 12 <input type="submit" value="更新"> 13</form>
失敗しているパターン
python
1###該当する部分のコードのみ載せています。### 2 3#フォームクラス 4class RegisterForm(FlaskForm): 5 username = StringField('名前') 6 email = EmailField('メールアドレス') 7 password = PasswordField('パスワード') 8 calender = StringField('カレンダーのタグ') 9 room = URLField('ミーティングのリンク') 10 submit = SubmitField('登録') 11 12#ユーザーテーブル 13class User(UserMixin, db.Model): 14 __tablename__ = 'User' 15 id = db.Column(db.Integer, primary_key=True) 16 username = db.Column(db.String(100), nullable=False) 17 email = db.Column(db.String(100), nullable=False, unique=True) 18 password = db.Column(db.String(100), nullable=False) 19 calender = db.Column(db.String(1000), nullable=False) 20 room = db.Column(db.String(1000), nullable=False) 21 def __init__(self, username, email, password, calender, room): 22 self.username = username 23 self.email = email 24 self.password = password 25 self.calender = calender 26 self.room = room 27 28with app.app_context(): 29 db.create_all() 30 31#該当のルーティングのみ載せています。 32@app.route('/<int:id>/update', methods=['GET', 'POST']) 33def adminuserupdate(id): 34 if 'login' in session: 35 #特定のid番号の情報を取得 36 user = User.query.get(id) 37 form = RegisterForm() 38 # if request.method == 'POST': 39 if form.validate_on_submit(): 40 #上書き 41 user.username = form.username.data 42 user.email = form.email.data 43 user.calender = form.calender.data 44 user.room = form.room.data 45 db.session.commit() 46 return redirect('/admin') 47 else: 48 return render_template('admin-userupdate.html', form=form)
html
1#当該箇所のみ載せています。 2#私の書き方は、明らかに間違っているので正しい書き方を教えてください。 3#よろしくお願いします。 4<h1>編集画面</h1> 5<form method="POST"> 6 <!-- <label for="usrename">ユーザー名</label> 7 <input type="text" name="username" value={{ user.username }}> 8 <label for="email">Email</label> 9 <input type="email" name="email" value={{ user.email }}> 10 <label for="calender">カレンダーのタグ</label> 11 <input type="text" name="calender" value={{ user.calender }}> 12 <label for="room">ルームのURL</label> 13 <input type="url" name="room" value={{ user.room }}> 14 <input type="submit" value="更新"> --> 15 {{ form.csrf_token }} 16 {{ form.username(value={{ user.username }}) }} 17 <br> 18 {{ form.email(value={{ user.email }}) }} 19 <br> 20 {{ form.calender(value={{ user.calender }}) }} 21 <br> 22 {{ form.room(value={{ user.room }}) }} 23 {{ form.submit }} 24</form>
回答1件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
2023/02/18 01:23