2013-02-27 95 views
1

Im使用django-taggit为博客创建标签系统。如何分隔和过滤对象,以便只显示具有选定标记的对象?有点像StackOverflow如果你点击django Tags创建标签索引Django

它会给你所有的问题标签django。我尝试了this blog post上描述的方法,但我得到了IndexError: tuple index out of range。这是我正在使用的代码:

url(r'^tagged/(?P<tag>[\w-]+)/$', TagView.as_view(), name='tag_url'), 

class TagView(ListView): 
    context_object_name = 'blog' 
    template_name = 'links/index.html' 
    def get_queryset(self): 
     return Blog.objects.filter(tags__name__in=[self.args[0]]) 
    def get_context_data(self, **kwargs): 
     context = super(TagView, self).get_context_data(**kwargs) 
     context['requested_tag'] = self.args[0] 
     return context 

<a href='{% url tag_url tag=tag %}'>{{ tag.name }}</a> 

我是否缺少一些让这种方法工作?

看起来这是一个很常见的编程必要性。也许你知道更好的方法...感谢您的想法!


编辑:根据@凯瑟琳的建议TagView:

class TagView(ListView): 
    model = Blog 
    context_object_name = 'blog_list' 
    template_name = 'tag-list.html' 
    def get_queryset(self): 
     queryset = super(TagView, self).get_queryset() 
     return queryset.filter(tags__name__in=self.kwargs['tags']) 

class Blog(models.Model): 
    name = models.CharField(max_length=50) 
    date = models.DateTimeField() 
    slug = models.SlugField() 
    article = models.TextField() 
    tags = TaggableManager() 
    def __unicode__(self): 
     return self.name 

标签list.html:

{% block content %} 
    stuff 
{% for blog in blog_list %} 
    {{ blog.article }} 
    {{ blog.name }} 
{% endfor %} 
{% endblock %} 

的blog_list没有模板存在,没有博客的对象是可用。相反,只有'东西'呈现给模板。任何想法表示赞赏!谢谢!

+0

指南:http://jquery.webspirited.com/2011/02/jquery-tagit -a-jquery-tagging-plugin/ – catherine 2013-02-27 03:24:10

+0

对不起,但那不是我所需要的。我想弄清楚如何配置我的URL和视图来创建标签的归档索引。因此,如果用户点击一个标签,对于ex'test',它将链接到所有具有相同标签的对象集合:'example.com/tagged/test /'。就像在StackOverflow上单击标签'django'一样,它将您链接到标记为django:'stackoverflow.com/questions/tagged/django /'的问题集合。但是,感谢您的意见。 – 2013-02-27 04:13:29

+0

啊,正在搜索... – catherine 2013-02-27 04:15:06

回答

1

这个答案是基于“编辑:TagView基于@凯瑟琳的建议:”。

你有一个错字,在get_queryset方法:

return queryset.filter(tags__name__in=self.kwargs['tags']) 

您使用tag而不是tags因此它应该是:

return queryset.filter(tags__name__in=[self.kwargs['tag']]) 
+0

我已经尝试过,但仍然无法正常工作。只有'stuff'出现在模板中,没有'blog'对象可用。感谢您的意见,如果您有任何额外的想法,我已经错过了,我将不胜感激。谢谢! – 2013-03-04 09:04:47

+0

的确应该是''return queryset.filter(tags__name__in = [self.kwargs ['tag']])'',我正在更新答案。 – bmihelac 2013-03-04 09:59:28

+0

@NickB你是否尝试用参数作为列表。这应该工作。 – bmihelac 2013-03-06 06:58:16

2
class TagView(ListView): 
    model = Blog 
    ...... 

    def get_queryset(self): 
     # Fetch the queryset from the parent get_queryset 
     queryset = super(TagView, self).get_queryset() 
     return queryset.filter(tags__name__in=self.kwargs['tag']) 
+0

感谢@catherine,但在上面列出的'TagView'中使用'def get_queryset'时,仍然出现错误'tuple index out of range'。 – 2013-02-27 05:29:45

+0

上面添加了追溯,如果您有任何想法。谢谢! – 2013-02-27 05:34:18

+0

感谢您的意见和支持@凯瑟琳(+1)!但是,我仍然无法访问与给定标签关联的博客对象。我已经添加了上面使用的完整代码。任何想法赞赏! – 2013-02-27 17:51:59