python - Django - 如何获得永久链接以使用 "throwaway"slug

标签 python django django-urls permalinks

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

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

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

我想像这样添加'slugified' url:

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 访问 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),那么 slugify 名称就会很好地显示在控制台中。

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

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

最佳答案

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

(?P<name_slug>\w+)

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

关于python - Django - 如何获得永久链接以使用 "throwaway"slug,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1569837/

相关文章:

python - 来自 API 的 Google App Engine Python 身份验证

django - 使用 {% url ??? %} 在 Django 模板中

django - 如何将 url 参数传递给 Django urls.py 中的 reverse_lazy

python - 在 GeoDjango 中导入空间数据时出错 - mpoly 字段的 KeyError

python - 在 Python 中迭代具有潜在条件的大型列表

Django - 转到 HTML 中的 #id 标签

python - 如何使用 web.py 安装 Python 时附带的 sqlite3 版本?

从模块导入全局时,python 包会自动导入

Java int 到 python int

Django 使用 Whoosh 搜索但没有 Haystack?