【问题标题】:Many-to-one Flask SqlAlchemy rendering多对一 Flask SqlAlchemy 渲染
【发布时间】:2015-05-09 17:17:45
【问题描述】:

我正在尝试为我的帖子创建类别。最终结果应该是用户在尝试发布时,他们选择了一个类别,帖子位于该类别下,因此可以在那里被索引。例如,他们会在 example.com/category/Flask 上找到所有具有 Flask 类别的帖子。我在 post 模型中添加了 category_id 和 category,然后我创建了一个具有 id 和名称的 Category 模型。然后创建了一个表单,以便我可以将类别添加到类别表中,以便用户可以开始为他们的帖子选择类别。对我有用的是我可以创建类别,在发帖时选择它们,当我查看数据库表时,我可以看到这些帖子具有分配给它们的类别。所以我现在想做的是为/category/创建一个视图,我不知道该怎么做。

class Post(db.Model):
    __tablename__ = 'posts'
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(80))
    body = db.Column(db.Text)
    timestamp = db.Column(db.DateTime, index=True, default=datetime.utcnow)
    author_id = db.Column(db.Integer, db.ForeignKey('users.id'))
    body_html = db.Column(db.Text)
    comments = db.relationship('Comment', backref='post', lazy='dynamic')
    category_id = db.Column(db.Integer, db.ForeignKey('categories.id'))
    category = db.relationship('Category',
                               backref=db.backref('posts', lazy='dynamic'))


    @staticmethod
    def on_changed_body(target, value, oldvalue, initiator):
        allowed_tags = ['a', 'abbr', 'acronym', 'b', 'blackquote', 'code', 'em', 'i', 'li', 'ol', 'pre', 'strong',
                        'ul', 'h1', 'h2', 'h3', 'p']
        target.body_html = bleach.linkify(bleach.clean(
            markdown(value, output_form='html'),
            tags=allowed_tags, strip=True))

db.event.listen(Post.body, 'set', Post.on_changed_body)


class Category(db.Model):
    __tablename__ = 'categories'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50))

    def __repr__(self):
        return '<Category {}>'.format(self.name)

我创建了一个 CategoryForm

class CategoryForm(Form):
    name = StringField('Category name', validators=[DataRequired()])
    submit = SubmitField('Submit')

Category.html

{% extends "base.html" %}
{% import "bootstrap/wtf.html" as wtf %}
{% import "_macros.html" as macros %}

{% block title %}Flasky{% endblock %}

{% block page_content %}

{{ wtf.quick_form(form) }}

{% endblock %}

分类视图

@main.route('/add_category', methods=['GET', 'POST'])
def add_category():
    form = CategoryForm()
    if form.validate_on_submit():
        category = Category(name=form.name.data)
        db.session.add(category)
        flash('A confirmation email jas been sent you.')
        return redirect(url_for('main.index'))
    return render_template('add_category.html', form=form)

然后在添加类别后,我编辑了 PostForm

def enabled_categories():
    return Category.query.all()


class PostForm(Form):
    body = PageDownField("What's on your mind?", validators=[DataRequired()])
    category = QuerySelectField('Category', query_factory=enabled_categories,
                                allow_blank=True)
    submit = SubmitField('Submit')

这是我创建的路线。

@main.route('/category/<name>')
def view_posts_in_category(name):
    name = Category.query.filter_by(name=name)
    return render_template('category.html', name=name)

那么现在在 category.html 'category/Flask' 中,如何显示 Flask 类别下的所有帖子?例如 {{ category.post }} ?我应该使用什么?

【问题讨论】:

  • 你得到什么错误?
  • @nathancahill 哦,对不起。我有点困惑。我不想得到任何错误。我想知道的是如何在我选择的类别下呈现帖子,例如example.com/category/Flask 我需要在 category.html 文件夹中添加什么?更新了我的问题。

标签: python flask sqlalchemy flask-wtforms


【解决方案1】:

你快到了。您需要做的是对属于所选类别的帖子运行查询并将其添加到模板中。应该是这样的:

@main.route('/category/<name>')
def view_posts_in_category(name):
    cat = Category.query.filter_by(name=name).first_or_404()
    return render_template('category.html', name=name, posts=cat.posts)

【讨论】:

  • 好的,所以我认为它有效,因为当我导航到其中一个类别名称时,我得到一个空白页面而不是 404 错误,在 category.html 中我使用了 {{ posts.name }} 但它是还是空的。我需要使用 for 循环吗?
  • posts 是一个列表,您必须像渲染完整的帖子列表一样渲染它。
  • {% for post in posts %} {{ posts.title }} {{ posts.category_id }} {% endfor %} 猜猜是这样的?
  • 是的。我建议您将用于完整列表的 for 循环移动到子模板中,然后从两个页面调用它。
  • 开始工作了!谢谢米格尔!在呈现类别名称时,甚至当我在列表中选择它时,它只显示为 ` `,而不是例如 Flask 我该如何更改它?
猜你喜欢
  • 2022-11-05
  • 1970-01-01
  • 2016-06-15
  • 2021-08-31
  • 1970-01-01
  • 2019-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多