2016-11-19 5 views
0

В моем шаблоне django я создаю две вкладки - «Все события» и «Ваши события». На первой вкладке я хочу перечислить все события и на второй вкладке хочу иметь отфильтрованный список событий (события, которые пользователь посещает).Итерация по списку дважды в шаблоне django

Для этого я дважды перебираю один и тот же список. Первая итерация - все хорошо, но вторая не дает никакого выхода. Как я могу это исправить?

Опубликовать мой 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}) 

модель Event

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

Сделать isat список вместо итератора –

+0

Пожалуйста, покажите представление. Что такое 'event_zip'? –

ответ

0

Вы используете Python 3, где zip является генератор; генераторы могут повторяться только один раз.

Вы можете это исправить, вызвав list явно:

event_zip = list(zip(event_list, is_att)) 

, но на самом деле это уже очень неэффективно, что нужно делать. Для каждого события вы запрашиваете всех связанных пользователей, а затем проверяете, находится ли текущий пользователь в этом списке. Вместо этого вы должны просто сделать один отдельный запрос, чтобы получить все события, которые пользователь связан с:

user_events = Event.objects.filter(list_of_users=user) 

и передать этот объект отдельно для шаблона.

(Этот запрос также может быть прописано user_events = user.user_list.all() - это излишне запутанным, потому что вы использовали неправильно именованные related_name на модели событий Название должно быть event_list, потому что это дает вам список событий, связанных с этим пользователем, или. , просто оставьте этот параметр полностью, чтобы вы получили значение по умолчанию, event_set.)

+0

Спасибо. Он работает сейчас. – mlemmy

0

Вы закомментировать "если is_att" во втором цикле wronly. Вместо того, чтобы:

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

Вы должны использовать

{# if is_att #} 

если заявление по-прежнему используется в шаблоне Джанго

+0

На самом деле у меня нет этих строк в моем коде, просто добавили его здесь, чтобы показать, что я хочу его фильтровать. {% for event, is_att in event_zip%} не дает никакого выхода при вызове во второй раз – mlemmy

Смежные вопросы