2017-12-01 8 views
0

私はリソースページを構築しています。私は3つの利用可能な言語に分割しています。Djangoのviews.pyのテンプレートタグを辞書に関連付ける

各言語について、一連のタグがあり、各タグには特定のアイテムのリンクがあります。例えば

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 

などなどなど。 「ポルトガル語」の下に書籍タグはありません。そして、それは私が望む振る舞いです:その特定のタグとの関係を持つリンクの数が0より大きくない場合、タグは表示されません。

# 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からの抜粋:これは私のmodels.pyである、と述べた

{% 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"タグを含む3つのリンクがある場合、辞書は"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

次の関係に基づいてモデルを修正しました。 複数の言語 - >各言語には、n個のタグに1を持つことができます - >各タグには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 %} 

言語がない場合には言語の代わりにビューから「タグ」を渡します(テンプレートから言語ループを削除します)。しかし、理想的にはあなたの要件に基づいて、あなたは言語ごとにループしているはずです。

関連する問題