2017-06-08 10 views
0

私は投稿を持ち、それぞれの投稿にタイトル、日付、リンク、タグがあるブログアプリを作成しようとしています。django-jinjaプロジェクトでManyToManyFieldを反復処理するにはどうすればよいですか?

これは、これはこれはblog_list.htmlで

<!-- blog_list.html --> 
{% extends "mysite/layout.html" %} 

{% block content %} 
    <h1>my blog posts</h1> 
    <ul> 
    {% for post in object_list %} 
     <li><span class="title"><a href="{{ post.link }}">{{ post.title }}</a></span></li> 
     <p>{{ post.date|date:"d-m-Y" }}</p> 
    {% endfor %} 
    </ul> 
{% endblock %} 

{% block sidebar %} 
    <h4 id="sidenav">tags</h4> 
    {% for post in object_list %} 
    <ul> 
     <!-- I want to show the tags here --> 
    </ul> 
    {% endfor %} 
{% endblock %} 

私blog_list.htmlである私のviews.py

# views.py 
from django.conf.urls import url, include 
from django.views.generic import ListView 
from blog.models import Post 

urlpatterns = [ 
    url(r'^$', ListView.as_view(queryset=Post.objects.all().order_by("-date"), template_name="blog/blog_list.html")), 
] 

であるI私のmodels.py

# models.py 
from django.db import models 

class Tag(models.Model): 
    name = models.CharField(max_length=20) 

    def __str__(self): 
     return self.name 

    class Meta: 
     ordering = ('name',) 

class Post(models.Model): 
    title = models.CharField(max_length=300) 
    date = models.DateTimeField() 
    link = models.URLField() 
    tags = models.ManyToManyField(Tag) 

    def __str__(self): 
     return self.title 

    @property 
    def tags_name(self): 
     return [x.name for x in self.tags] 

    class Meta: 
     ordering = ('date',) 

ですすべての投稿の詳細を表示しています。サイドバーには、利用可能なすべてのブログ投稿からすべてのタグを表示します。 post.tagsはManyToManyFieldなので、どうすればそれを反復処理できますか?

+0

post.tags.all()%} '' 'で' {'%for tagを試したことがありますか?そのループの中では、 '' '{{tag}}' ''としてタグにアクセスできるはずです。 –

+1

@ISOmetricあなたが '{post.tags.all%}のタグのための%{{tag}} {%endfor%}'の '()'を意味すると思います! – hansTheFranz

+0

@hansTheFranzはい、私はあなたが正しいと信じています、私の間違い。 –

答えて

0

あなたは関係のすべての要素を取得するには、テンプレートで.allを使用したい:私のブラケットの問題を修正するための@hansTheFranzへ

{% for tag in post.tags.all %} 
    {{ tag }} 
{% endfor %} 

感謝を。

タグを繰り返さないことについては、これは現在の状況では非常に困難です。代わりに、ビュー内のポストを取得し、その中のタグを抽出することで、重複をチェックする自由が増えます。このような何か:その後、

def tags(request): 
    posts = Post.objects.all() 
    tag_list = [] 
    for post in posts: 
     tags = post.tags.all() 
     for tag in tag: 
      if not (tag in tag_list): 
       tag_list.append(tag) 
    context_dict = { "tags": tag_list, "posts": posts } 
    return render(request, 'blog/blog_list.html', context_dict) 

urlpatterns = [ 
    url(r'^$', tags, name="tags"), 
] 

そして、もっとようになり、あなたのテンプレートを変更します。また

{% block sidebar %} 
    <h4 id="sidenav">tags</h4> 
    <ul> 
     {% for tag in tags %} 
     <li>{{ tag }}</li> 
     {% endfor %} 
    </ul> 
{% endblock %} 

、代わりにobject_listを参照の我々が定義されているので、あなたが今、postsを参照することにより、投稿のリストにアクセスすることができますテンプレートに渡されているコンテキスト辞書のような投稿のリスト。

私はこれをテストしていないので、それほど効率的ではないかもしれませんが、おおまかに言えばうまくいくはずです。私の大学の講師がこの本を書きました:http://www.tangowithdjango.com/book17/、これは、私がやったように、URLとは別に、より多くの書面を書くスタイルを奨励しています。私が行ったことが不明瞭であるか反対である場合は、その本を見て、そこに何かがあるかどうかを知りたいかもしれません。

関連する問題