【问题标题】:how can i do a feed of posts with flask and Jinja2?我怎样才能用烧瓶和 Jinja2 做帖子的提要?
【发布时间】:2020-09-24 18:01:05
【问题描述】:

我正在使用 flask-SQLAchemy 来管理我的数据库,并且我有一个名为 post 的表,其中包含 content、title、date、likes 和 profile_id 列提要我使用了一个简单的 jinja2 模板,我发送了一个包含 db 中所有帖子的变量,当我渲染帖子时,我创建了一个 for 循环来渲染它,但我无法获取发布帖子的人的姓名(我有一个带有他的 id 的变量);所以我的问题是如何获取在 jinja 模板中发布帖子的用户的姓名?

【问题讨论】:

  • 用户数据保存在哪里?两张表之间有什么关系?如果您共享您的代码,例如您的模型、flask 方法和模板,这将非常有用。这样会更容易为您提供帮助。
  • 这是我的 DB 类 class Post(db.Model): __tablename__ = "posts" id = db.Column(db.Integer, primary_key=True) content = db.Column(db.Text) title = db.Column(db.String) date = db.Column(db.DateTime) user_id = db.Column(db.Integer, db.ForeignKey('users.id')) user = db.relationship('User', foreign_keys=user_id) def __ini__(self, content, title, date, user_id): self.content = content self.title = title self.date = date self.user_id = user_id def __repr__(self): return "<Post %r>"
  • 这是我的路由方法:@app.route('/profile/<int:id>/') def profile(id): posts = Post.query.filter_by(id=id) if current_user.id == id: return redirect(url_for("my_profile")) else: return render_template('profile.html',profile=user, posts=posts)
  • 我的模板有一个像这样的 for 循环 {{% for post in posts %}} <p1> {{ post.title }}</p1> <p1> {{ post.content }}</p1> {{% endfor %}}
  • 我想取发帖者的名字,

标签: python-3.x flask sqlalchemy jinja2


【解决方案1】:

“profile_id”列是主键吗?如果是这样,那么您的帖子可能实际上显示的是帖子的 ID(即,对应于主键或用于标识某个帖子的主列的数字)而不是您想要的。

class Post(db.Model):
    profile_id = db.Column(db.Integer, primary_key=True)
    likes = db.Column(db.Integer, nullable=False)
    title = db.Column(db.String(250))
    date_posted = db.Column(db.DateTime)
    content = db.Column(db.Text)

尝试分析上面的代码,我假设这是您的代码,您需要做的是添加另一列,在这种情况下,该列称为“作者”,因此请执行以下操作:

class Post(db.Model):
    profile_id = db.Column(db.Integer, primary_key=True)
    likes = db.Column(db.Integer, nullable=False)
    title = db.Column(db.String(250))
    author = db.Column(db.String(250))
    date_posted = db.Column(db.DateTime)
    content = db.Column(db.Text)

完成了吗?尝试通过执行以下操作打开终端并构建新模型:

python name-of-your-app.py

from name-of-your-app import *

db.create_all()

exit()

通过这样做,您可以确保实际使用的是您的新模型而不是旧模型。接下来要做的是将“作者”列添加到添加函数和编辑函数中,然后确保在 jinja2 模板中为“作者”列添加新输入,并将“profile_id”替换为“作者” '。如果你还是一头雾水,请参考我在学习flask时使用的代码。另外,请参阅提供的链接,我也用它来制作提供的代码。

https://www.youtube.com/watch?v=XHGpPCYmPvI

from flask import Flask, render_template, request, redirect, url_for
from flask_sqlalchemy import SQLAlchemy
from flask_simplelogin import SimpleLogin, is_logged_in
from datetime import datetime

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///blog.db'
app.config['SECRET_KEY'] = 'something-secret'
app.config['SIMPLELOGIN_USERNAME'] = 'admin'
app.config['SIMPLELOGIN_PASSWORD'] = 'admin'
db = SQLAlchemy(app)
SimpleLogin(app)

class Blogpost(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(50))
    subtitle = db.Column(db.String(50))
    author = db.Column(db.String(20))
    date_posted = db.Column(db.DateTime)
    content = db.Column(db.Text)

@app.route('/')
def index():
    posts = Blogpost.query.order_by(Blogpost.date_posted.desc()).all()

    return render_template('index.html', posts=posts)

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

@app.route('/add')
def add():
    if is_logged_in():
        return render_template('add.html')
    else:
        return redirect('/')

@app.route('/post/<int:post_id>')
def post(post_id):
    post = Blogpost.query.filter_by(id=post_id).one()

    return render_template('post.html', post=post)

@app.route('/edit/<int:post_id>')
def edit(post_id):
    post = Blogpost.query.filter_by(id=post_id).one()
    if is_logged_in():
        return render_template('edit.html', post=post)
    else:
        return redirect('/')

@app.route('/addpost', methods=['POST'])
def addpost():
    title = request.form['title']
    subtitle = request.form['subtitle']
    author = request.form['author']
    content = request.form['content']
    post = Blogpost(title=title, subtitle=subtitle, author=author, content=content, date_posted=datetime.now())

    db.session.add(post)
    db.session.commit()

    return redirect(url_for('index'))

@app.route('/deletepost/<int:post_id>', methods=['POST'])
def deletepost(post_id):
    post = Blogpost.query.get_or_404(post_id)

    db.session.delete(post)
    db.session.commit()
    return redirect(url_for('index'))

@app.route('/editpost/<int:post_id>', methods=['POST'])
def editpost(post_id):
    post = Blogpost.query.get_or_404(post_id)

    post.title = request.form['title']
    post.subtitle = request.form['subtitle']
    post.author = request.form['author']
    post.content = request.form['content']

    db.session.commit()
    return redirect('/')

if __name__ == "__main__":
    app.run(debug=True)

【讨论】:

  • 我有这个类的列 ID:class Post(db.Model): __tablename__ = "posts" id = db.Column(db.Integer, primary_key=True) content = db.Column(db.Text) title = db.Column(db.String) date = db.Column(db.DateTime) user_id = db.Column(db.Integer, db.ForeignKey('users.id')) user = db.relationship('User', foreign_keys=user_id) def __ini__(self, content, title, date, user_id): self.content = content self.title = title self.date = date self.user_id = user_id def __repr__(self): return "&lt;Post %r&gt;"
  • 这个表和表用户有关系
  • 我想使用 user_id(ForeignKey) 来获取帖子中的数据用户,例如姓名和用户名
  • 抱歉回复晚了。再一次,这就是问题所在,您使用的列实际上只返回一个整数,您可以做的是创建一个专用于用户名的列(即“admin”、“user1”、“user2”)作为一个字符串来实际显示给 jinja。 id 和 user_id 应该是同一个而不是单独的实体,因为除非您正在开发高度灵活的应用程序,否则您的应用程序不需要那种复杂性。
  • 但是,如果您不喜欢删除“user_id”列,这里不做判断哥们。我建议您不要删除“user_id”列,而是创建一个空字典,然后将该字典返回到 jinja 模板。然后做一个条件,基本上说“如果字典.key中的user_id”,然后返回字典的值。您还没有完成,在您的 add_post 模板中,确保添加另一个用户名输入,然后处理该用户名以便添加到该字典中。这个解决方案很简单,可以满足您的需求。祝你好运!
猜你喜欢
  • 2018-08-30
  • 2021-03-17
  • 2012-10-28
  • 2022-08-19
  • 1970-01-01
  • 1970-01-01
  • 2018-09-21
  • 1970-01-01
  • 2019-09-01
相关资源
最近更新 更多