【问题标题】:relating template tag to dictionary in views.py in Django将模板标签与Django中views.py中的字典相关联
【发布时间】:2017-12-01 21:47:29
【问题描述】:

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

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

例如:

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 的 sn-p:

{% 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})

从我的代码中删除了不相关的部分。正如你所看到的,我已经设法用标签名称和它们的关系数量填充了一个字典。如果有三个带有“Books”标签的链接,那么字典会说:"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
    ...

我认为字典可能是将标签与模板标签相关联的好方法,并验证与该标签的链接关系数是否大于零,但我不知道从现在开始如何进行.

我提前感谢您的帮助。如果需要任何其他细节或更正,请告诉我,我会在此处插入。

【问题讨论】:

    标签: python html django dictionary tags


    【解决方案1】:

    我根据以下关系修改了您的模型。 多种语言 -> 每种语言可以有 1 到 n 个标签 -> 每个标签可以有 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 %} 
    

    如果您不关心语言,则从视图中传递“标签”而不是语言(并从模板中删除语言循环)。但理想情况下,根据您的要求,您应该按语言循环。

    【讨论】:

      猜你喜欢
      • 2019-10-22
      • 2013-05-06
      • 2017-06-13
      • 2020-01-22
      • 2015-11-25
      • 2020-04-17
      • 1970-01-01
      • 2021-09-08
      • 2021-10-14
      相关资源
      最近更新 更多