Django:包含来自多个字段的值的URL模式

时间:2014-07-25 11:32:56

标签: python django

我是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 &raquo;</a></p>

get_absolute_url定义为:

    def get_absolute_url(self):
        return reverse ('blog.views.post', args = [self.slug])

2 个答案:

答案 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