2015-05-09 71 views
0

我正在嘗試爲我的帖子創建類別。最終結果應該是用戶在嘗試發佈時,他們選擇一個類別,該帖子歸入該類別,因此可以在那裏進行索引。例如,他們會繼續訪問example.com/category/Flask,他們會找到所有包含Flask類別的帖子。我在post模型中添加了category_id和category,然後我創建了一個帶有id和名稱的Category模型。然後創建一個表單,以便我可以將類別添加到類別表中,以便用戶可以開始爲他們的帖子選擇類別。我所能工作的是,我可以創建類別,在發佈時選擇它們,當我查看數據庫表格時,我可以看到這些帖子有分配給它們的類別。所以我現在想做的是爲/ category /創建一個視圖,我不知道該怎麼做。多對一燒瓶SqlAlchemy呈現

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}}?我應該使用什麼?

+0

你會得到什麼錯誤? – nathancahill

+0

@nathancahill哦,對不起。我有點困惑。我沒有得到任何錯誤。問題是我想知道如何渲染我在例如'example.com/category/Flask'上選擇的類別下的帖子,我需要在category.html文件夾中添加什麼內容?更新我的問題。 – qasimalbaqali

回答

2

你快到了。您需要做的是對屬於選定類別的帖子運行查詢並將其添加到模板中。這將是這樣的:

@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) 
+0

好的,我認爲它起作用,因爲當我導航到其中一個類別名稱時,我得到了一個空白頁面而不是404錯誤,在category.html中我使用了{{posts.name}},但它仍然是空的。我需要使用for循環嗎? – qasimalbaqali

+0

'posts'是一個列表,您必須完全像呈現完整帖子列表一樣呈現它。 – Miguel

+0

'{%爲崗位員額%} {{posts.title}} {{posts.category_id}} {%ENDFOR%}'猜是這樣的? – qasimalbaqali