2016-11-07 85 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') 但仍然想知道如何清除数据库完全 –