2016-11-07 67 views
-1

我正在使用slugify,並且我不知道如何讓我的帖子標題重新開始,我是否需要在我的帖子中創建一個新列?我一整天都被困在這裏。你怎麼slugify一個網址?

有什麼建議嗎?

Views.py

@app.route('/posts/<title>') 
@login_required 
def show(title): 

    link = db.session.query(Post).filter_by(title = title).one() 
    link2 = slugify(link.title) 

    return render_template("post.html", post=link2, pid=id, title=link2) 

Models.py

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) 




    def __init__(self, title, body): 
     self.title = title 
     self.body = body 

錯誤信息

File "C:\Program Files\Python35-32\lib\site-packages\sqlalchemy\orm\query.py", line 2760, in one 
    raise orm_exc.NoResultFound("No row was found for one()") 
sqlalchemy.orm.exc.NoResultFound: No row was found for one() 
+0

嘗試洛'title'。它是否被正確接收? –

+0

錯誤只是說它找不到任何行,而您期望一行。我通常使用'Post.query.filter_by(title = title).first()',然後檢查結果是否爲null。 –

+0

@btquanto你能改說我不明白嗎? –

回答

1

我的猜測是你使用諸如「這是我的第一篇博文」這樣的帖子的標題,這非常棒。我也猜測你想要使用slu in爲了每個職位有一個更友善的鏈接。在前一種情況下,slu would將會像「this-is-my-first-blog-post」一樣。

因此給定一個slu,,您的帖子將在/ posts/{unique-post-slug}路線中可用而不是/ posts/{title}。我的建議是將slug存儲在數據庫中以檢索帖子,因爲反向slugify並不那麼容易。

總之你的模式應該是:

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) 
    slug = db.Column(db.Text, index=True) 

    def __init__(self, title, body): 
     self.title = title 
     self.body = body 
     self.slug = slugfiy(title) 

通知的index=True選項。這是爲了更快的查詢。

,並應使您的文章的路線會

@app.route('/posts/<slug>') 
@login_required 
def show(slug): 

    post = db.session.query(Post).filter_by(slug=slug).one() 

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

在你post.html文件,你可以使用所有的職位字段(ID,標題,正文,蛞蝓)作爲post.id,崗位。標題等

+0

'db.Text'用於存儲多行文本,您可以使用'db.string'。 –

2

你把slug而不是title在你的視圖和基於slug的查詢數據庫中。同時創建郵件slugify標題並將其存儲在slug字段中。

Views.py

@app.route('/posts/<slug>') 
@login_required 
def show(slug): 
    post = db.session.query(Post).filter_by(slug = slug).first() 
    if post: 
     return render_template("post.html", post=post) 

    abort(404) 

注意,我們使用的.first代替.one這裏,因爲.first回報None如果發現而.one沒有文章提出,你需要趕上並根據其流動破例。

如果找不到帖子,我們將返回404

Models.py

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) 
    slug = db.Column(db.String(80), index=True) 

    def __init__(self, title, body): 
     self.title = title 
     self.body = body 
     self.slug = slugify(title) 
+0

非常感謝維韋克,我想指出的是,我用 蛞蝓= db.Column(db.String(80)) 但我沒有添加索引= true屬性,當我嘗試過,感謝那 你解釋它的方式非常有意義。 但是,我不斷收到此錯誤 sqlalchemy.exc.OperationalError:(sqlite3.OperationalError)no such column:posts.slug [SQL:'SELECT posts.id AS posts_id,posts.title AS posts_title,posts.body AS posts_body,posts.slug AS posts_slug \ nFROM posts'] Traceback(最近一次調用最後一次) –

+0

@EliHood我認爲你還沒有在你的文章數據庫表中創建'slug'列。你可以手動在數據庫中插入列,或者如果你使用的是'flask-sqlalchemy',那麼你可以用'db.create_all()'來創建表。 –

+0

現在的工作,我所做的是使用不同的SQL數據庫的名稱, 代替test.db的,我用test12.db這是你indentify在__init__file 這樣 的app.config你的數據庫名稱[ 'SQLALCHEMY_DATABASE_URI'] ='sqlite:///'+ os.path.join(tempfile.gettempdir(),'test122.db') 但仍然想知道如何清除數據庫完全 –