1

我使用django-taggit为博客创建标记系统。您如何分离和过滤对象,以便只显示带有选定标签的对象?如果你点击 django,有点像 StackOverflow 上的样子标签

它会给你所有标记为 django 的问题。我已经尝试过这篇博文中描述的方法,但我得到了一个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 基于@catherine 的建议:

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

标签列表.html:

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

模板中不存在 blog_list,并且没有可用的博客对象。相反,只有“东西”被呈现给模板。任何想法表示赞赏!谢谢!

4

2 回答 2

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'])
于 2013-02-27T04:30:35.290 回答
1

此答案基于“编辑:基于@catherine 建议的 TagView:”。

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

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

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

return queryset.filter(tags__name__in=[self.kwargs['tag']])
于 2013-03-04T08:52:42.577 回答