【问题标题】:Django - how can I get permalink to work with "throwaway" slugDjango - 我怎样才能获得永久链接以使用“一次性”蛞蝓
【发布时间】:2010-12-06 21:22:57
【问题描述】:

我正在尝试向我的 django 应用程序中的 url 添加 slug,就像 SO 一样。

目前,我的页面可以使用这样的 url 正常工作:

http://example.com/foo/123/

我想像这样添加“slugified”网址:

http://example.com/foo/123/foo-name-here

我可以让它正常工作,只需修改 urlconf 并向视图函数添加一个一次性值:

#urls.py

ulpatterns = patterns('project.app.views',
    url(r'^foo/(?P<foo_id>\d+)/(?P<name_slug>\w+)/$', 'foo_detail', name='foo_detail'),
)

#views.py:

def foo_detail(request, foo_id, name_slug):
    # stuff here, name slug is just discarded

使用 slug 访问 url 就可以了。

但是,我的问题是当我使用 @models.permalink 时。

对于我的Foo 模型,我曾经有以下,效果很好:

@models.permalink
def get_absolute_url(self):
    return ('foo_detail', [str(self.id),])

但是,在我更改之后,每当我在模板中调用 {{ foo.get_absolute_url }} 时,结果总是一个空字符串。

我尝试了以下两个 get_absolute_url 的替换,但都不起作用:

from django.template.defaultfilters import slugify

# attempt 1
@models.permalink
def get_absolute_url(self):
    return ('foo_detail', [str(self.id), slugify(self.name)])

# attempt 2
@models.permalink
def get_absolute_url(self):
    return ('foo_detail', (), {
        'foo_id': str(self.id), 
        'name_slug': slugify(self.name),
    })

请注意,如果我在返回之前添加一个 print slugify(self.name),则 slugified 名称会很好地显示在控制台中。

在我的模板中调用{{ foo.get_absolute_url }} 时,结果总是一个空字符串,我没有收到任何错误。

我知道我可以用return '/foo/%s/%s' % (str(self.id), slugify(self.name)) 替换该方法,但我正在尝试使永久链接正常工作,以便我的URL 只在一个地方定义。我做错了什么?

【问题讨论】:

  • 我应该注意到我这样做的方式有点奇怪和不必要:我没有理由需要在 urlconf 或视图函数中保留name_slug。在回答者指出我的问题后,我可以分别回到r'^foo/(?P&lt;foo_id&gt;\d+)/([\w-]+)/$'foo_detail(request, foo_id):,这样更干净。
  • 您最终使用了哪种永久链接方法?我在看同样的东西......
  • @thornomad 在我的问题中尝试 #1 是我最终得到的结果。事实证明,我的 get_absolute_url 方法没有问题,只是我的 url 模式。

标签: python django django-urls permalinks


【解决方案1】:

要检查的一件事,因为我也遇到了这个问题:

(?P<name_slug>\w+)

slugify 是否在任何地方添加连字符?如果是这样,正则表达式将不匹配,连字符是非单词字符。修复使用[\w-]+ 或类似的。

【讨论】:

    猜你喜欢
    • 2014-06-28
    • 1970-01-01
    • 1970-01-01
    • 2020-07-28
    • 1970-01-01
    • 2021-05-02
    • 1970-01-01
    • 1970-01-01
    • 2011-06-04
    相关资源
    最近更新 更多