迭代Django列表并仅显示唯一的Django-Taggit标记

时间:2016-05-17 22:40:19

标签: python django python-3.x django-models django-templates

我想列出Django-Taggit中的所有标签,只要它们在一个对象中使用,并且只在它们属于特定模型时才会使用。例如;我有一个列出部件的页面和一个列出工具的页面。我正在标记所有内容,但在我的主页上,我想在不同的列中显示工具标签和部件标签。

下面的代码将显示所有标签,甚至是未使用的标签以及所有型号的标签。下面的代码是我目前使用的代码,我知道它为什么这样做,但我不知道如何过滤掉exit对象有一个标记,if它属于工具或部分模型,这就是为什么我有一个工具if循环包装它,但这似乎是错误的。谢谢你的帮助。

查看

for

模板

def main_index(request):
    tools = Tool.objects.prefetch_related('uploads').all().order_by('title')
    tags = Tag.objects.all()

    return render(request, 'main/index.html', {'tools': tools, 'tags': tags})

1 个答案:

答案 0 :(得分:0)

摆弄它并拉出我的头发;我能够迭代我的查询集,然后使用distinct()过滤掉标记名称。我的新代码如下 - 这似乎是一种干净的工作方式,我可以找到它的其他用途。感谢您抽出宝贵时间尝试帮助。

<强>视图

def main_index(request, tag_slug=None):
    tools = Tool.objects.prefetch_related('uploads').distinct('tags')
    parts = Part.objects.prefetch_related('uploads').distinct('tags')
    tag = None

    if tag_slug:
        tag = get_object_or_404(Tag, slug=tag_slug)
        tools = Tool.objects.filter(tags__in=[tag])
        parts = Part.objects.filter(tags__in=[tag])

    return render(request, 'main/index.html', {'tools': tools, 'parts': parts, 'tag': tag})

<强>模板

{% for t in tools %}
  {% for tag in t.tags.all %}
    <div class="col-md-3 col-sm-6">
      <div class="c-content-feature-2" data-wow-delay1="1s" data-height="height">
        <h5 class="c-font-uppercase c-center"><a href="{% url "products:tool_list_by_tag" tag.slug %}">{{ tag.name }}</a></h5>
      </div>
    </div>
    {% if not forloop.last %} {% endif %}
  {% endfor %}
{% endfor %}