【问题标题】:Django DetailView failing to find object based on SLUGDjango DetailView 找不到基于 SLUG 的对象
【发布时间】:2013-08-17 12:46:35
【问题描述】:

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 字段获取正确的对象?

【问题讨论】:

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


    【解决方案1】:

    Timmy 的回答在确定问题时是正确的——slug 是小写的。他建议您使用小写的网址。不错的解决方案...但也许您喜欢这样的网址?

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

    【讨论】:

    • 在通过slugify 函数过滤时,slug 以小写形式保存到数据库中。除非您编写自己的 slugify 函数,否则它将始终以小写形式在数据库中,因此更改查询无济于事
    • 是的,数据库中的 slug 是小写的...但 URL 中的 slug 显然不是。这让您有两个选择:在 slug 上调用 str.lower(),或者执行不区分大小写的查询。虽然更改字符串的大小写可能对数据库更好,但将查询更改为__iexact 编写起来很简单。
    • ... 或者只是首先使用正确的 slug... 正如您所建议的 ;)
    【解决方案2】:

    Django 的slugify 方法:

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

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

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

    你需要使用小写:

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

    检查您的数据库以查看 slug 的确切保存方式

    【讨论】:

      猜你喜欢
      • 2018-07-10
      • 2014-11-27
      • 2022-01-15
      • 1970-01-01
      • 2021-04-24
      • 2013-08-17
      • 2019-03-11
      • 2022-01-16
      • 1970-01-01
      相关资源
      最近更新 更多