Django - 我怎么能永久地使用“一次性”slug

时间:2009-10-15 01:21:36

标签: python django django-urls permalinks

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

目前,我的网页可以正常使用这样的网址:

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

我想像这样添加'slugified'网址:

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

我可以通过简单地修改urlconf并向view函数添加一次性值来使其正常工作:

#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 v url 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),那么在控制台中显示的已知名称很好。

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

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

1 个答案:

答案 0 :(得分:7)

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

(?P<name_slug>\w+)

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