【问题标题】:Creating Tag Index Django创建标签索引 Django
【发布时间】:2013-02-27 02:45:26
【问题描述】:

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

它会给你所有标记为 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 基于@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,并且没有可用的博客对象。相反,只有“东西”被呈现给模板。任何想法表示赞赏!谢谢!

【问题讨论】:

  • 对不起,但这不是我需要的。我试图弄清楚如何配置我的 url 和视图以创建标签的存档索引。因此,如果用户单击标签,例如test,它将链接到所有具有相同标签的对象集合:example.com/tagged/test/。就像在 StackOverflow 上单击标签 django 一样,它会将您链接到标签为 django:stackoverflow.com/questions/tagged/django/ 的问题集合。不过,感谢您的意见。
  • 我也是。感谢您的任何意见!
  • 您希望它准确还是只包含 django 标签?
  • 不只是寻找 django 标签,而是寻找链接以匹配数据库中存在的任何标签。感谢您的任何想法

标签: django tags


【解决方案1】:
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'])

【讨论】:

  • 感谢@catherine,但在上面列出的TagView 中使用def get_queryset 时仍然出现错误tuple index out of range
  • Traceback 添加在上面,如果您有任何想法。谢谢!
  • 感谢您的想法和支持@catherine (+1)!但是,我仍然无法访问与给定标签关联的博客对象。我已经添加了我在上面使用的完整代码。任何想法表示赞赏!
【解决方案2】:

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

你有一个错字,get_queryset 方法:

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

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

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

【讨论】:

  • 我也试过了,但还是不行。只有stuff 出现在模板中,没有blog 对象可用。感谢您的意见,如果您有任何我错过的其他想法,我将不胜感激。谢谢!
  • 确实应该是return queryset.filter(tags__name__in=[self.kwargs['tag']]),我正在更新答案。
  • @NickB 您是否尝试将参数作为列表。这应该有效。
猜你喜欢
  • 1970-01-01
  • 2020-12-25
  • 2022-10-17
  • 1970-01-01
  • 2021-11-13
  • 1970-01-01
  • 2016-12-29
  • 2021-06-03
  • 2021-10-30
相关资源
最近更新 更多