使用Flask、Jinja展示SQLite数据库中所有用户发帖的实现问题
解决方案
不需要修改Feed类为多对多关系,你现有的MyFeed和User的一对多关联完全可以满足需求,问题出在路由传参和模板遍历的逻辑错误,按以下步骤调整即可:
1. 修正Flask路由逻辑
你当前在GET请求中已经查询了全部Feed数据MyFeed.query.all(),但没有把这个数据传递给模板,只传入了当前登录用户current_user,所以模板只能读取到当前用户发布的内容。修改后代码如下:
@views.route('/tweets', methods = ['GET', 'POST']) @login_required def tweet(): # 不管GET还是POST请求,最终都要返回全量Feed列表,先统一查询 all_feeds = MyFeed.query.order_by(MyFeed.date.desc()).all() if request.method == 'POST': my_feed = request.form.get('my_feed') if len(my_feed) < 1: flash('Tweet is too short!', category='error') else: new_tweet = MyFeed(data=my_feed, user_id=current_user.id) db.session.add(new_tweet) db.session.commit() flash('Tweet added!', category='success') # 发布新内容后刷新列表 all_feeds = MyFeed.query.order_by(MyFeed.date.desc()).all() # 把全量Feed列表传递给模板 return render_template("tweets.html", user=current_user, all_feeds=all_feeds)
2. 修正HTML模板遍历逻辑
原模板遍历的是当前用户的Feed列表user.feeds,且所有帖子都固定显示当前登录用户的信息,需要改为遍历传入的全量Feed列表,通过每个Feed关联的用户属性读取发布者信息:
<h1 align="center">Feed</h1> <ul class="list-group list-group-flush" id="feeds"> {% for my_feed in all_feeds %} <li class="list-group-item"> <div> <!-- 取当前Feed对应的发布者信息,不是固定用当前登录用户user --> <b class="pull-center">{{my_feed.user.first_name}}</b> <p class="pull-right">{{my_feed.date}}</p> <p>{{my_feed.user.email}}</p> </div> <br> {{ my_feed.data }} </li> {% endfor %} </ul>
3. 确认模型关系配置
确保你的MyFeed模型类中已经定义了和User的关联关系,示例配置如下:
class MyFeed(db.Model): id = db.Column(db.Integer, primary_key=True) data = db.Column(db.String(10000)) date = db.Column(db.DateTime(timezone=True), default=func.now()) user_id = db.Column(db.Integer, db.ForeignKey('user.id')) # 新增下面这行关联关系,就可以通过my_feed.user拿到发布者信息 user = db.relationship('User', backref='feeds')
内容的提问来源于stack exchange,提问作者acolyter11
相关产品推荐
相关产品推荐

