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

0 投票
2 回答
1525 浏览
提问于 2025-04-18 14:44

我刚开始学习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是文章的标识。

我尝试过,但不知道怎么才能正确实现:

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

如果你在使用基于类的视图,那么像这样的代码就可以用了:

# 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,它应该放在 <项目根目录>/post/templates/post/post_detail.html 这个位置。

2

你的 get_absolute_url 方法里有两个错误。首先,你需要使用你定义的URL名称属性。其次,你需要提供两个参数:类别和slug。

所以应该是:

return reverse('blog_post', args=[self.category, self.slug])

撰写回答