我正在构建一个资源页面,并且我将它分为三种可用语言。
对于每种语言,都会有一组标签,每个标签都会有一组特定项目的链接。
例如:
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
...
我认为字典可能是将标记与模板标记相关联的好方法,并验证与该标记的链接关系数量是否大于零,但我不知道如何从从今起。
我事先感谢你的帮助。如果需要任何其他细节或更正,请告诉我,我将其插入此处。
答案 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;从视图而不是语言(并从模板中删除语言循环)。但理想情况下,根据您的要求,您应该按语言进行循环。