我是python的新手,我正在尝试构建一个以两个字段作为参数的URL模式。这是我的模型的一部分:
CATEGORY_CHOICES = (
('M', 'Music'),
('G', 'Games'),
('T', 'TV'),
('F', 'Film'),
('O', 'Misc'),
)
category = models.CharField(max_length = 1, choices = CATEGORY_CHOICES)
slug = models.SlugField(unique=True, max_length=255)
我想要实现的是能够调用如下:thisblog.com/music/this-post其中/ music是类别而/ this-post是slug。
我有一次尝试,但我无法弄清楚如何正确地做到这一点:
urlpatterns = patterns('',
url(r'^admin/', include(admin.site.urls)),
url(r'^$', 'blog.views.index'),
url(r'^(?P<category>[\w\-]+)/(?P<slug>[\w\-]+)/$', blog_post, name = 'blog_post'),
)
这给我一个'NoReverseMatch at /'错误。
非常感谢任何帮助:)
更新:
在我的html模板中,我有一个链接:
<p><a class="btn btn-default" href="{{post.get_absolute_url}}" role="button">Read more »</a></p>
get_absolute_url定义为:
def get_absolute_url(self):
return reverse ('blog.views.post', args = [self.slug])
答案 0 :(得分:2)
get_absolute_url
方法中有两处错误。首先,您需要使用URL的名称属性,因为您已经定义了它。其次,您需要提供两个参数:category和slug。
所以它应该是:
return reverse('blog_post', args=[self.category, self.slug])
答案 1 :(得分:0)
如果您使用的是基于类的视图,那么这样的方法就可以了:
# views.py
class ViewPost(DetailView):
model = Post # change this to the model
def get_queryset(self):
queryset = super(ViewQuizListByCategory, self).get_queryset()
return queryset.filter(category=self.kwargs['category'])
# urls.py
from .views import ViewPost
...
url(r'^(?P<category>[\w\-]+)/(?P<slug>[\w\-]+)/$',
ViewPost.as_view(),
name='blog_post'),
...
模板将为post_detail.html
,并将设置为<project_root>/post/templates/post/post_detail.html