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

TM.*_*TM. 4 python django permalinks django-urls

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

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

http://example.com/foo/123/
Run Code Online (Sandbox Code Playgroud)

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

http://example.com/foo/123/foo-name-here
Run Code Online (Sandbox Code Playgroud)

通过简单地修改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
Run Code Online (Sandbox Code Playgroud)

用slug visting url工作得很好.

但是,我的问题是我正在使用的时候@models.permalink.

对于我的Foo模型,我曾经有以下,它工作得很好:

@models.permalink
def get_absolute_url(self):
    return ('foo_detail', [str(self.id),])
Run Code Online (Sandbox Code Playgroud)

但是,在我更改之后,每当我调用{{ 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),
    })
Run Code Online (Sandbox Code Playgroud)

请注意,如果我print slugify(self.name)在返回之前添加一个,那么在控制台中显示的细节名称就好了.

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

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

Ben*_*pan 7

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

(?P<name_slug>\w+)
Run Code Online (Sandbox Code Playgroud)

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