将模板标记与Django中views.py中的字典相关联

时间:2017-12-01 21:47:29

标签: python html django dictionary tags

我正在构建一个资源页面,并且我将它分为三种可用语言。

对于每种语言,都会有一组标签,每个标签都会有一组特定项目的链接。

例如:

English:
    Books:
      * The lord of the rings
      * The Silmarillion
      * Introduction to Calculus
      * Electricity for dummies
    Articles:
      * Why Python is superb (or something)
      * The Tao of Eating Too Much Sugar (or something)
Portuguese:
    Articles:
      * Investindo em títulos de Tesouro

依此类推。您可能会注意到"葡萄牙语"没有Books标签。这就是我想要的行为:如果与该特定标签有关系的链接数量不大于0,那么标签就不应该出现。

那就是说,这是我的models.py:

# tags
class Tag(models.Model):
    title = models.CharField(max_length=50, blank=False, unique=True, error_messages={'unique':"Esta tag já existe."}) 

    def __str__(self):
        return self.title

# link instances
class Link(models.Model):
    title = models.CharField(max_length=100, blank=False)
    url = models.URLField(blank=False)
    language = models.CharField(max_length=10, blank=False)
    tag = models.ForeignKey(Tag, on_delete=models.CASCADE, null=False, blank=False)

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse("link_detail", kwargs={'pk': self.pk})

我的resources_list.html中的一个片段:

{% for tag in tags %}
<div style="display:inline;" class="col-lg-12 col-md-12 col-sm-12 col-xs-12">

  <span></span>
  <h3>{{tag.title}}</h3>
{% for link in links %}
    {% if link.tag == tag %}
    <a class="col-lg-10 col-md-10 col-xs-10 col-sm-10" style="margin-top 3px; margin-bottom: 3px; float: left;" href="{{link.url}}"><p>{{link.title|truncatechars_html:36|safe}}</p></a>

    {% if user.is_authenticated %}
        <a class="col-lg-1 col-md-1 col-xs-1 col-sm-1" style="float: right;" href="{% url 'link_detail' pk=link.pk %}"><span class="glyphicon glyphicon-cog"></span></a>
    {% endif %}
    {% endif %}
{% endfor %}
</div>

到目前为止,我已设法显示所有标签和相关链接,但问题是,仍然显示没有内容的标签。

我已经编写了我的views.py相关函数,如下所示:

def link_list_view(request):

    links = Link.objects.all().order_by('title')
    tags = Tag.objects.all().order_by('title')

    tag_dict = {}

    for tag in tags:
        tag_rel = tags.get(title=tag)
        tag_rel_entities = tag_rel.link_set.all()
        tag_rel_entities_number = len(tag_rel_entities)
        tag_dict[tag.title] = tag_rel_entities_number         

    return render(request, 'resources/resources_list.html', {'links':links, 'tags': tags})

从我的代码中删除了不相关的部分。如您所见,我已设法填充带有标签名称及其关系数量的字典。如果有三个链接与&#34;图书&#34;标签,然后字典会说:"Books": 3

我认为可能的解决方案是以下逻辑:

For tag in tags
  If links_with_relation_to_tag_number >= 1
     <h3>{{tag.title}}</h3>
  Endif
  For link in links:
    if link.tag == tag
    ...

我认为字典可能是将标记与模板标记相关联的好方法,并验证与该标记的链接关系数量是否大于零,但我不知道如何从从今起。

我事先感谢你的帮助。如果需要任何其他细节或更正,请告诉我,我将其插入此处。

1 个答案:

答案 0 :(得分:1)

我已根据以下关系修改了您的模型。 多种语言 - &gt;每种语言可以有1到n个标签 - &gt;每个标签可以有0到n个链接

#languages
class Language(models.Model):
    name = models.CharField(max_length=10, blank=False)

    def __str__(self):
        return self.name

# tags
class Tag(models.Model):
    title = models.CharField(max_length=50, blank=False) 
    language = models.ForeignKey(Tag, null=False, blank=False, related_name="tags")

    class Meta:
        ordering = ['title']

    def __str__(self):
        return self.title

# link 
class Link(models.Model):
    title = models.CharField(max_length=100, blank=False)
    url = models.URLField(blank=False)
    tag = models.ForeignKey(Tag, on_delete=models.CASCADE, null=False, blank=False, related_name="links")

    class Meta:
        ordering = ['title']

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse("link_detail", kwargs={'pk': self.pk})

查看

def link_list_view(request):
    languages = Language.objects.all()
    return render(request, 'resources/resources_list.html', {'languages':languages})

模板

{% for language in languages %}
    {% with language.tags.all as tags %}
    {% for tag in tags %}
        {% with tag.links as links %}
        {% if link.count > 0 %}       
            <div style="display:inline;" class="col-lg-12 col-md-12 col-sm-12 col-xs-12">

            <span></span>
            <h3>{{tag.title}}</h3>
            {% for link in links %}
                <a class="col-lg-10 col-md-10 col-xs-10 col-sm-10" style="margin-top 3px; margin-bottom: 3px; float: left;" href="{{link.url}}"><p>{{link.title|truncatechars_html:36|safe}}</p></a>
            {% endfor %}
            </div>
        {% endif %}
        {% endwith %}
    {% endfor %}   
    {% endwith %}
{% endfor %} 

如果您不关心语言,请通过标记&#39;从视图而不是语言(并从模板中删除语言循环)。但理想情况下,根据您的要求,您应该按语言进行循环。