2016-11-19 8 views
0

私のdjangoテンプレートでは、「すべてのイベント」と「あなたのイベント」の2つのタブを作成しています。最初のタブではすべてのイベントを一覧表示し、2番目のタブではフィルタリングされたイベントのリスト(ユーザーが参加しているイベント)を取得します。djangoテンプレートでリストを2回繰り返します

これを行うには、同じリストで2回ループします。最初の反復はすべて良いですが、2番目の反復は何も出力しません。どうすれば修正できますか?

下記のHTMLテンプレートを投稿してください。

{% block content%} 

<ul class="nav nav-tabs" style="padding-top: 60px"> 
    <li class="active"><a data-toggle="tab" href="#allevents">All events</a></li> 
    <li class=""><a data-toggle="tab" href="#yourevents">Your events</a></li> 
</ul> 

<div class="container-fluid"> 
    <h1>Event list</h1> 
</div> 

<div class="tab-content"> 
    <div id="allevents" class="tab-pane fade in active"> 
    {% for event, is_att in event_zip %} 

    <p> {{ event.name }} </p> 
    DISPLAY ALL EVENTS HERE - displays correctly 

    {% endfor %} 
    </div> 

    <div id="yourevents" class="tab-pane fade"> 
    {% for event, is_att in event_zip %} 

    <!-- {% if is_att %} --> 
    <p> {{ event.name }} </p> 
    DISPLAY FILTERED EVENTS HERE - doesn't give any output 
    Does not work even with 'if' statement commented out. 
    <!-- {% endif %} --> 

    {% endfor %} 
    </div> 


</div> 

{% endblock %} 

views.py

@login_required 
def events(request): 
    user = request.user 

    event_list = Event.objects.all().order_by('date') 
    is_att = [] 

    for e in event_list: 
     ev = get_object_or_404(Event, pk=e.id) 
     if user in ev.list_of_users.all(): 
      is_att.append(True) 
     else: 
      is_att.append(False) 

    event_zip = zip(event_list, is_att) 

    if request.POST.get('join'): 
     event_id = request.POST['join'] 
     event_to_join = get_object_or_404(Event, pk=event_id) 
     event_to_join.list_of_users.add(user) 
     return HttpResponseRedirect(reverse('events')) 

    if request.POST.get('leave'): 
     event_id = request.POST['leave'] 
     event_to_leave = get_object_or_404(Event, pk=event_id) 
     event_to_leave.list_of_users.remove(user) 
     return HttpResponseRedirect(reverse('events')) 

    return render(request, 'events/events.html', {'event_zip' : event_zip}) 

イベントモデル

class Event(models.Model): 
    name = models.CharField(max_length=50, blank=False, unique=True) 
    owner = models.ForeignKey(User, on_delete=models.CASCADE) 
    date = models.DateTimeField(blank=False) 
    place = models.CharField(max_length=50, blank=False) 
    list_of_users = models.ManyToManyField(User, related_name='user_list', blank=True) 

    @property 
    def is_in_future(self): 
     return self.date > timezone.now() 

    def __str__(self): 
     return self.name 
+0

is_attの値は何ですか? –

+0

イテレータを反復子ではなくリストにする –

+0

ビューを表示してください。 'event_zip'とは何ですか? –

答えて

0

で使用されている場合を使用する必要があります。ジェネレータは一度しか反復できません。

あなたが明示的にlistを呼び出すことによってこの問題を解決することができます:

event_zip = list(zip(event_list, is_att)) 

が、本当にこれはすでにやっているために非常に非効率的なものです。すべてのイベントについて、関連するすべてのユーザーを要求して、現在のユーザーがその一覧に含まれているかどうかをテストしています。代わりに、単一の別のクエリを実行して、ユーザーが関連付けられているすべてのイベントを取得するだけで、そのオブジェクトをテンプレートに個別に渡すことができます。

(このクエリもuser_events = user.user_list.all()綴らすることができます - あなたは、イベントモデルにmisnamed related_nameを使用しているので、不必要に混乱している、それはあなたがそのユーザーに関連するイベントのリストが表示されますので、名前は、event_listであるべきである。またはそのパラメータをそのまま残しておけば、デフォルト値のevent_setが得られます)。

+0

ありがとうございました。それは今働く。 – mlemmy

0

"is_att場合、" あなたはwronly第二のループでコメントアウトします。代わりに:

<!-- {% if is_att %} --> 

あなたは

{# if is_att #} 

if文はまだあなたがzipが発電機であるPythonの3を、使用しているDjangoテンプレート

+0

実際には私のコードにこれらの行がありません。 {event_zip%でイベント%、is_att} – mlemmy

関連する問題