94003


ユーザー情報の更新を行うためのページの作成を行っております。  
user_maintenance.htmlでユーザーの「変更」ボタンを押した後、account.htmlへ遷移するのですが、  
なぜか、ユーザー名は更新元のユーザー名が表示された状態ですが、メールアドレス部分が表示されない状態となってしまいます。（図参照）

どこが、間違っているのかが、どうしても分からない状況です。

どなたかご教示の程、よろしくお願い致します。  
[![画像の説明をここに入力](https://i.stack.imgur.com/Use8m.png)](https://i.stack.imgur.com/Use8m.png)

**app.py**

[code]

    class User(db.Model):
        __tablename__ = 'users'
     
        id = db.Column(db.Integer, primary_key=True)
        email = db.Column(db.String(64), unique=True, index=True)
        username = db.Column(db.String(64), unique=True, index=True)
        password_hash = db.Column(db.String(128))
        administrator = db.Column(db.String(1))
        post = db.relationship('BlogPost', backref='author', lazy='dynamic')
     
    
        def __init__(self, email, username, password_hash, administrator):
            self.email = email
            self.username = username
            self.password_hash = password_hash
            self.administrator = administrator
    
    
        def __repr__(self):
            return f"UserName: {self.username}"
    
    
    class RegistrationForm(FlaskForm):
        # HTMLに表示するための各フィールドを作成
        email = StringField('メールアドレス', validators=[DataRequired(), Email(message='正しいメールアドレスを入力してください')])
        username = StringField('ユーザー名', validators=[DataRequired()])
        password = PasswordField('パスワード', validators=[DataRequired(), EqualTo('pass_confirm', message='正しいパスワードを入力してください')])
        pass_confirm = PasswordField('パスワード(確認)', validators=[DataRequired()])
        submit = SubmitField('登録')
    
        def validate_username(self, field):
            if User.query.filter_by(username=field.data).first():
                raise ValidationError('ユーザーは既に使われています。')
    
        def validate_email(self, field):
            if User.query.filter_by(email=field.data).first():
                raise ValidationError('メールアドレスはは既に使われています。')
    
    
    class UpdateUserFome(FlaskForm):
        email = StringField('メールアドレス', validators=[DataRequired(), Email(message='正しいメールアドレスを入力してください')])
        username = StringField('ユーザー名', validators=[DataRequired()])
        password = PasswordField('パスワード', validators=[DataRequired(), EqualTo('pass_confirm', message='パスワードが一致していません')])
        pass_confirm = PasswordField('パスワード(確認)', validators=[DataRequired()])
        submit = SubmitField('更新')
    
        def __init__(self, user_id, *args, **kwargs):
            # 継承元のクラスを残しつつ必要な処理を行うことができる
            super(UpdateUserFome, self).__init__(*args, **kwargs)
            self.id = user_id
    
    @app.route('/<int:user_id>/account', methods=['GET', 'POST'])
    def account(user_id):
        user = User.query.get_or_404(user_id)
        form = UpdateUserFome(user_id)
        # 更新処理
        if form.validate_on_submit():
            # elifでフォームで取得したデーターをモデルに格納
            user.username = form.username.data
            user.email = form.email.data
            # パスワードは、フォームに入力された場合だけ更新を行うため、さらにifでフォームに入力されたか確認を行う
            if form.password.data:
                user.password_hash = form.password.data
            db.session.commit()
            flash('更新されました')
            return redirect(url_for('user_maintenance'))
        # 初期表示
        elif request.method == 'GET':
            # DBから取得したユーザー名、メールをフォームに格納
            form.username.data = user.username
            form.email.date = user.email 
        return render_template('account.html', form=form)
    
    if __name__ == '__main__':
        app.run(debug=True)
    
    
[/code]

**user_maintenance.html**

[code]

    <div class="card-header">
        <h4>最新のユーザー</h4>
    </div>
    <table class="table table-striped">
        <thead class="table-dark">
            <tr>
                <th>ID</th>
                <th>ユーザー名</th>
                <th>メールアドレス</th>
                <th>管理者</th>
                <th>ブログ投稿数</th>
                <th>変更</th>
            </tr>
        </thead>
        <tbody>
            {% for user in users %}
            <tr>
                <td>{{user.id}}</td>
                <td>{{ user.username }}</td>
                <td>{{ user.email}}</td>
                <td>{{ user.administrator}}</td>
                <td><a href="#">ブログ投稿数</a></td>
                <td><a href="{{url_for('account', user_id=user.id)}}" class="btn btn-secondary">
                    変更
                </a></td>
            </tr>
            {% endfor %}
        </tbody>  
    </table>
    
[/code]

**account.html**

[code]

    <h3>ユーザー更新</h3>
    <p>ユーザー情報を変更してください。</p>
    <form method="POST">
        {{ form.hidden_tag() }}
        <div class="mb-3">
            {{ render_field(form.username, placeholder="ユーザー名", class="form-contorol form-contorol-lg") }}
        </div>
        <div class="mb-3">
            {{ render_field(form.email, placeholder="メールアドレス", class="form-contorol form-contorol-lg") }}
        </div>
        <div class="mb-3">
            {{ render_field(form.password, placeholder="新パスワード", class="form-contorol form-contorol-lg") }}
        </div>
        <div class="mb-3">
            {{ render_field(form.pass_confirm, placeholder="新パスワード(確認)", class="form-contorol form-contorol-lg") }}
        </div> 
        {{ form.submit(class="btn btn-outline-light w-100", value="更新") }} 
    </form>
    
[/code]


CC BY-SA 4.0
2023-02-25T07:32:27.500
93998
2023-02-25T12:38:21.870
2023-02-25T11:51:12.797
3060
question
python html flask
Flask　ユーザー情報の更新


ソースを読む限り、フォームのフィールドに対する受け渡しは`data`なのだと思いますが、一箇所だけ`date`になっています。

[code]

    @app.route('/<int:user_id>/account', methods=['GET', 'POST'])
    def account(user_id):
        ## （略）
        # 初期表示
        elif request.method == 'GET':
            # DBから取得したユーザー名、メールをフォームに格納
            form.username.data = user.username
            form.email.date = user.email  # <- 'date' へ代入している
        return render_template('account.html', form=form)
    
[/code]


CC BY-SA 4.0
2023-02-25T12:38:21.870
94003
2023-02-25T12:38:21.870
2784
93998
answer