web2py - 如何使用数据库 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 并显示相关的数据库条目?
非常感谢
解决方案
该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。
推荐阅读
- interface - 使用自己的应用程序管理管理员凭据
- angular - 如何等待在 peerjs 上回答的远程流
- github - 将敏感信息存储到 github 私人仓库是否安全?
- html - HTML-我正在尝试使输入滑块居中,同时保持其周围的文本正常
- flutter - Flutter:表单验证同时验证所有文本字段
- reactjs - Gatsby 页面在 url 之后显示 /
- java - 如何在数字数组中写入一个字符
- python - Django - 如何管理翻译块内的变量?
- angular - 角度嵌套路由
- c# - 无法从 X509Certificate2 对象创建 SustainSys CertificateElement 以更新代码中的 SAML2 配置