代码之家  ›  专栏  ›  技术社区  ›  TM. Randy Simon

Django-如何让permalink使用“一次性”slug

  •  4
  • TM. Randy Simon  · 技术社区  · 16 年前

    目前,我有一些页面可以很好地使用如下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)

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

    我知道我可以用 return '/foo/%s/%s' % (str(self.id), slugify(self.name))

    1 回复  |  直到 16 年前
        1
  •  7
  •   Dominic Rodger    16 年前

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

    (?P<name_slug>\w+)
    

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

    推荐文章