【问题标题】:How to display specific user information in a separate page using flask and flask-sqlalchemy?如何使用flask和flask-sqlalchemy在单独的页面中显示特定的用户信息?
【发布时间】:2023-03-06 15:13:01
【问题描述】:

我在我的应用程序中只制作了一张桌子。我想在页面 admin.html 上显示一些信息和 特定用户信息在 info.html 页面上。我应该如何提供查询以显示客户在管理页面上单击的特定用户信息。我想仅在 info.html 页面上显示我的数据库的其他属性,例如电子邮件、电话号码、大学名称。这是我的文件:

数据库

class database(db.Model):
    id=db.Column('user_id',db.Integer, primary_key=True)
    name = db.Column(db.String(20))
    text=db.Column(db.String(1000))
    personality_score=db.Column(db.Integer)
    skills_score=db.Column(db.Integer)
    experience_score=db.Column(db.Integer)
    total_score=db.Column(db.Integer)
    college=db.Column(db.String(100))
    email=db.Column(db.String(100))
    phone_number=db.Column(db.String(100))

app.py

@app.route('/admin')
def admin():
    return render_template('admin.html',database=database.query.order_by(database.total_score.desc()).all())

@app.route('/info')
def info():
    return render_template('info.html')

admin.html

<table class="css-serial">
         <tbody>
            <tr>
               <th>Rank</th>
               <th>ID</th>
               <th>Name</th>
               <th>Profile Summary</th>
               <th>Personality Score</th>
               <th>Skills Score</th>
               <th>Experience Score</th>
               <th>Total Score</th>
            </tr><tr>
               {% for data in database %}
                  <td></td>
                  <td>{{data.id}}</td>
                  <td><a href=info>{{ data.name }}</a></td>
                  <td>{{ data.text }}</td>
                  <td>{{ data.personality_score }}</td>
                  <td>{{data.skills_score}}</td>
                  <td>{{data.experience_score}}</td>
                  <td>{{data.total_score}}</td>
               </tr></tbody>
               {% endfor %}
      </table>

我没有在 info.html 文件中编写任何内容,因为我无法弄清楚如何获取“id”或要在该页面上显示的数据。

【问题讨论】:

  • 你的问题有点不清楚。如果用户单击{{ data.name }} 上的锚标记,您是否要移动到info.html 页面?
  • 是的,我想这样做。我在 admin.html 文件中添加了“{{ data.name }}”。这样我就能够通过 info.html 文件显示特定的用户信息。我认为我的问题并不完全清楚。感谢你的回答。它改进了我的应用程序。

标签: python flask flask-sqlalchemy


【解决方案1】:

假设我正确理解了您的问题,您希望执行以下操作:

  1. 您想点击{{data.name}} 上的锚标记,此人应首先被重定向到“/info”路线。

  2. 在该路线上,将显示与姓名被点击的人相关的信息。

(1) 是烧瓶中的重新路由概念。为此我们使用url_for 方法。

(2) 是 sqlAlchemy ORM 中的一个基本 WHERE 查询,我们可以使用filter_by 过滤器和first() 收集器。

你的路由'/info'应该带有一个参数,用户ID,我们将使用它来过滤用户信息。优选地,信息路由可以改变如下:

@app.route('/info/<id>')
def info(id):
    user_info = database.query.filter_by(id=id).first()
    return render_template('info.html', information=user_info)

如下更改您的 admin.html:

<table class="css-serial">
  <tbody>
    <tr>
      <th>Rank</th>
      <th>ID</th>
      <th>Name</th>
      <th>Profile Summary</th>
      <th>Personality Score</th>
      <th>Skills Score</th>
      <th>Experience Score</th>
      <th>Total Score</th>
    </tr>
    <tr>
      {% for data in database %}
      <td></td>
      <td>{{data.id}}</td>
      <td>
        <a href="{{url_for('app.info', id=data.id)}}">{{ data.name }}</a>
      </td>
      <td>{{ data.text }}</td>
      <td>{{ data.personality_score }}</td>
      <td>{{data.skills_score}}</td>
      <td>{{data.experience_score}}</td>
      <td>{{data.total_score}}</td>
    </tr>
  </tbody>
  {% endfor %}
</table>

如果你注意,在'./info'路由中执行的方法中,我们添加了一个参数,用于过滤数据库中的信息。

filter_by基本上是在任何基于SQL的数据库中创建WHERE子句,first()是信息的收集器,基本上会给出第一行对应的信息,即满足过滤条件。

由于两个人可以有相同的名字,我们在过滤器中传递{{data.id}}

使用render_template() of '/info' 路由中传递的information 参数可以制作info.html 页面。

所以这应该有效。我根据对问题的理解回答了这个问题。

你的问题不清楚。

如果你有什么不明白或者我误解了什么,请告诉我。

【讨论】:

  • 感谢您的回答。有效。 @keshav
【解决方案2】:

首先,在info() 视图函数中检索database 表中的所有数据:

@app.route('/info')
def info():
    page = request.args.get('page', 1, type=int)
    user_info = database.query.order_by(
        database.timestamp.desc()).paginate(
            page, app.config['POSTS_PER_PAGE'], False
        )
    next_url = url_for('info',
                       page=user_info.next_num) \
        if user_info.has_next else None
    prev_url = url_for('info',
                       page=user_info.prev_num) \
        if user_info.has_prev else None
    return render_template('info.html',
                           title='User Information',
                           next_url=next_url,
                           prev_url=prev_url,
                           user_info=user_info.items
                           )

在我的示例中,我按照用户在database 中记录的时间顺序查询database。现在你没有那个字段,但我只是想指出它以防你想使用它。这意味着您将新列 timestamp = db.Column(db.DateTime, default=datetime.utcnow) 添加到 database

此外,我添加了分页功能,如果您的数据库有这么多条目,您可以选择在每页中显示一定数量的数据,并可以选择移动到第 2、3 页... 阅读更多from the documentation.

现在user_info 中有数据,您可以使用for 循环来显示所有用户信息。

<table class="css-serial">
         <tbody>
            <tr>
               <th>Rank</th>
               <th>ID</th>
               <th>Name</th>
               <th>Profile Summary</th>
               <th>Personality Score</th>
               <th>Skills Score</th>
               <th>Experience Score</th>
               <th>Total Score</th>
            </tr>
            {% for data in user_info %}
               <tr>
                  <td></td>
                  <td>{{data.id}}</td>
                  <td><a href=info>{{ data.name }}</a></td>
                  <td>{{ data.text }}</td>
                  <td>{{ data.personality_score }}</td>
                  <td>{{data.skills_score}}</td>
                  <td>{{data.experience_score}}</td>
                  <td>{{data.total_score}}</td>
            </tr>
           {% endfor %}
         </tbody>
</table>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-27
    • 2016-11-13
    • 2022-07-03
    • 2020-10-08
    • 1970-01-01
    • 2013-08-24
    • 2019-10-25
    • 1970-01-01
    相关资源
    最近更新 更多