Django DetailView无法根据SLUG查找对象

时间:2013-08-15 10:27:46

标签: django slug django-class-based-views

models.py

class Tag(models.Model):
    name = models.CharField(max_length=64, unique=True)     
    slug = models.SlugField(max_length=255, unique=True)

    def save(self, *args, **kwargs):
        self.slug = slugify(self.name)
        super(Tag, self).save(*args, **kwargs)


urls.py

url(r'^tag/(?P<slug>[A-Za-z0-9_\-]+)/$',
    TagDetailView.as_view(),
    name='tag_detail'),      


views.py

class TagDetailView(DetailView):
    model = Tag
    template_name = 'tag_detail_page.html'
    context_object_name = 'tag'

这给了我一个404:

Page not found (404)
http://localhost:9999/tag/RandomTag/
No tag found matching the query

为什么Django无法根据slug字段获取正确的对象?

2 个答案:

答案 0 :(得分:4)

Django的slugify方法:

  

转换为小写,删除非单词字符(字母数字和下划线)并将空格转换为连字符。还剥离前导和尾随空格。

您正在寻找Camel Case'd标签:

http://localhost:9999/tag/RandomTag/

你需要使用小写:

http://localhost:9999/tag/randomtag/  # or `random-tag` depending on the name

检查您的数据库,确切了解slug的保存方式

答案 1 :(得分:0)

蒂米的答案在确定问题时是正确的 - slu is是小写的。他建议你使用小写网址。这不是一个糟糕的解决方案......但也许你喜欢这样的网址?

如果您希望slug不区分大小写,请在视图上设置slug_field = 'slug__iexact'