Django DetailView,url参数很少
假设我有下一个型号:Django DetailView,url参数很少,django,Django,假设我有下一个型号: class Category(models.Model): cat_name = models.CharField(u'name',max_length=50, unique=True) slug = models.SlugField(u'URL',unique=True) class News(models.Model): title = models.CharField(max_length=250) slug = models.Slu
class Category(models.Model):
cat_name = models.CharField(u'name',max_length=50, unique=True)
slug = models.SlugField(u'URL',unique=True)
class News(models.Model):
title = models.CharField(max_length=250)
slug = models.SlugField(unique=True)
category = models.ForeignKey(Category,null=True,on_delete=models.SET_NULL)
我的get_absolute_url函数如下所示:
def get_absolute_url(self):
return ('news:detail',(), {'slug':self.slug})
url看起来像/article/
如果我想要像
这样的URL?我怎样才能做到这一点?您可以做到:
# models.py
def get_absolute_url(self):
return ('news:detail', (), {
'category_slug': self.category.slug,
'slug': self.slug,
})
# views.py
class NewsDetail(DetailView):
model = News
slug_field = 'slug'
slug_url_kwarg = 'slug'
def get_queryset(self):
return News.objects.filter(category__slug=self.kwargs['category_slug'])
# urls.py
url(r'(?P<category_slug>[a-z0-9\-]+)/(?P<slug>[a-z0-9\-]+)/$', NewsDetail.as_view(), name='news')
#models.py
def get_绝对_url(自身):
return('news:detail',(){
“category_slug”:self.category.slug,
“slug”:self.slug,
})
#views.py
类NewsDetail(DetailView):
模型=新闻
slug_字段='slug'
slug_url_kwarg='slug'
def get_queryset(自我):
return News.objects.filter(category\u slug=self.kwargs['category\u slug'])
#url.py
url(r'(?P[a-z0-9\-]+)/(?P[a-z0-9\-]+)/$”,NewsDetail.as_view(),name='news')
因此,我们的想法是在url定义中添加两个参数。最后一个通常用于查询新闻行,get\u queryset
将使用第一个来按指定类别过滤新闻
更多关于文档中url中参数的信息-您当前的url定义是什么?非常棒的方法,但我得到了下一个错误:
“news”不是注册的命名空间
您需要使用命名空间注册url。我以为你已经这么做了。如果没有,您可以将get\u absolute\u url
更改为只使用news
url名称而不使用名称空间。但是现在,这个:与参数“()”和关键字参数“{slug':'sample news slug'}”的“detail”相反。尝试了1个模式:['(?P[-\uw\\d]+)/(?P[-\uw\\d]+)/$']
您还需要在其中包括类别\u段塞
。看看我的答案。我提供了我不懂的get\u absolute\u url
的示例实现<代码>类别_slug包含在示例中<代码>返回('news:detail',(),{'category_slug':self.category.slug,'slug':self.slug})