多对一 Flask SqlAlchemy 渲染
Many-to-one Flask SqlAlchemy rendering
我正在尝试为我的 post 创建类别。最终结果应该是用户在尝试 post 时,他们选择了一个类别,post 位于该类别下,因此可以在那里对其进行索引。因此,例如,他们会继续 example.com/category/Flask,然后他们会找到所有具有 Flask 类别的 post。我向 post 模型添加了一个 category_id 和类别,然后我创建了一个带有 ID 和名称的类别模型。然后创建了一个表单,以便我可以将类别添加到类别 table,这样用户就可以开始为他们的 post 选择类别。对我有用的是,我可以创建类别,在 posting 时选择它们,当我查看数据库 tables 时,我可以看到那些 posts 已分配给类别他们。所以我现在想做的是为 /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 类别下的所有 post?例如 {{ category.post }} ?我应该使用什么?
你快到了。您需要做的是 运行 查询属于所选类别的帖子并将其添加到模板中。它会是这样的:
@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)
我正在尝试为我的 post 创建类别。最终结果应该是用户在尝试 post 时,他们选择了一个类别,post 位于该类别下,因此可以在那里对其进行索引。因此,例如,他们会继续 example.com/category/Flask,然后他们会找到所有具有 Flask 类别的 post。我向 post 模型添加了一个 category_id 和类别,然后我创建了一个带有 ID 和名称的类别模型。然后创建了一个表单,以便我可以将类别添加到类别 table,这样用户就可以开始为他们的 post 选择类别。对我有用的是,我可以创建类别,在 posting 时选择它们,当我查看数据库 tables 时,我可以看到那些 posts 已分配给类别他们。所以我现在想做的是为 /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)
然后在添加类别后,我用
编辑了 PostFormdef 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 类别下的所有 post?例如 {{ category.post }} ?我应该使用什么?
你快到了。您需要做的是 运行 查询属于所选类别的帖子并将其添加到模板中。它会是这样的:
@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)