Django DetailView未能基于SLUG找到对象
型号.pyDjango DetailView未能基于SLUG找到对象,django,slug,django-class-based-views,Django,Slug,Django Class Based Views,型号.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)
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)
url(r'^tag/(?P<slug>[A-Za-z0-9_\-]+)/$',
TagDetailView.as_view(),
name='tag_detail'),
class TagDetailView(DetailView):
model = Tag
template_name = 'tag_detail_page.html'
context_object_name = 'tag'
url.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)
url(r'^tag/(?P<slug>[A-Za-z0-9_\-]+)/$',
TagDetailView.as_view(),
name='tag_detail'),
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的方法:
转换为小写,删除非单词字符(字母数字和下划线),并将空格转换为连字符。还可以去除前导和尾随空格
您正在寻找一个Camel Case'd标签:
http://localhost:9999/tag/RandomTag/
您需要使用小写字母:
http://localhost:9999/tag/randomtag/ # or `random-tag` depending on the name
检查数据库,查看
slug
是如何保存的蒂米的答案在确定问题时是正确的——slug是小写的。他建议您使用小写url。这是个不错的解决方案。。。但也许你喜欢这样的url
如果希望slug不区分大小写,请在视图上设置
slug\u字段='slug\u iexact'
。slug通过slagify
函数过滤后,以小写形式保存到DB中。除非您编写自己的slagify
函数,否则它在数据库中始终是小写的,因此更改查询将无济于事是的,slug在数据库中是小写的。。。但URL中的slug显然不是。这就给了您两个选择:对slug调用str.lower()
,或者执行不区分大小写的查询。虽然更改字符串的大小写可能对DB更好,但将查询更改为\uuuuIExact
对编写来说是微不足道的。。。。或者首先使用正确的子弹当然。。。正如您所建议的那样(;)代码>