首页 > 解决方案 > 如何使用数据库 slug 字段来显示相应的博客条目和 URL

问题描述

我正在运行一个包含博客的 web2py Web 应用程序。我在帖子数据库中使用 slug 字段,并希望将 slug 显示为 url 的一部分(而不是博客帖子 ID)。我设法将 slug 字段作为 request.args 传递给 post 函数,但无法显示相关帖子 - 相反,我收到 404 Page Not Found 错误。当我将 post.id 字段用作 request.args 时,帖子显示正确,但 url 显示的是帖子 ID,而不是 slug 字段。我想主要出于 SEO 原因使用 slug。任何指针都会很棒!

在我的模型中,我有:

db.define_table('post',
                Field('title', unique=True),
                Field('subtitle'),
                Field('intro', 'text'),
                Field('body', 'text'),
                Field('body_mid', 'text'),
                Field('body_end', 'text'),
                Field('published_on', 'date'),
                Field('category'),
                Field('file1', 'upload'),
                Field('caption_one'),
                Field('file2', 'upload'),
                Field('caption_two'),
                Field('slug', 'string', compute=lambda r: r['title']),
                format = '%(title)s')

在我的控制器中,我有:

#this selects all posts
def blog():
    post = db().select(db.post.ALL, orderby=~db.post.published_on)
    return dict(post=post)
#this selects a post based on request.args
def show():
    post = db.post(request.args(0, cast = int)) or redirect(URL('index'))
    return dict(post=post)

在我的博客视图中(这有效):

{{for entry in post:}} {{=LI(A(entry.title, _href=URL("show", args=entry.id)))}} {{pass}}

当我更改为(这不起作用): {{for entry in post:}} {{=LI(A(entry.title, _href=URL("show", args=entry.slug)))}} { {经过​​}}

如何正确使用 slug 字段以在 URL 中显示 slug 并显示相关的数据库条目?

非常感谢

标签: web2py

解决方案


db.post(id)语法要求传递给的值db.post()是记录 ID。如果要基于另一个字段选择记录,则必须执行以下操作之一:

`db.post(slug=request.args(0))`

或者:

`db(db.post.slug == request.args(0)).select().first()`

请参阅http://web2py.com/books/default/chapter/29/06/the-database-abstraction-layer#Fetching-a-Row


推荐阅读