Фильтрация DateTimeField по прошлым и будущим датам django
Моя проблема в том, что я делаю таймер до ближайшего события на сайте. События я храню в модели django. Делая вывод даты в шаблоне не знаю как сделать так, чтобы события выводились по очереди. У меня получилось отфильтровать прошедшие даты в шаблоне, но я не могу сделать автоматическую смену события, когда предыдущее событие прошло. То есть до него осталось 00.00.00. У меня не получается также вывести первый уже отфильтрованный элемент. Работает только {% if forloop.counter0 == 1 %}, но это выдает элемент всего списка, а не элемент отфильтрованного списка. Я просто пытался вывести первое событие, где дата больше текущей. Я пробовал использовать какие-то внутренние циклы после фильтрации, но у меня не получается это сделать. Обращаюсь к вам с этой проблемой потому что зашел в большой тупик. Был бы очень благодарен за вашу помощь. Была мысль отфильтровать события сразу в views.py с помощью filter, но я опять же запутался. Я еще пока новичок в этом деле, но очень хотелось бы добить этот проект.
Шаблон
{% for x in date %}
{% with alpha=0 %}
{% if x.date|timesince >= "1 sec" %}
{% else %}
{% if forloop.counter0 == 1 %}
<div class="mec-wrap">
<article class="mec-event-countdown-style3 ">
<div class="mec-event-countdown-part1">
<div class="mec-event-countdown-part-title">
<div class="mec-event-upcoming"><span>Далее</span> Ближайшее событие</div>
</div>
<div class="mec-event-countdown-part-details">
<div class="mec-event-date">
<span class="mec-date1">{{x.date|date:"d"}}</span>
<span class="mec-date2">
{% if x.date|date:"m" == "01" %}Января{% endif %}
{% if x.date|date:"m" == "02" %}Февраля{% endif %}
{% if x.date|date:"m" == "03" %}Марта{% endif %}
{% if x.date|date:"m" == "04" %}Апреля{% endif %}
{% if x.date|date:"m" == "05" %}Мая{% endif %}
{% if x.date|date:"m" == "06" %}Июня{% endif %}
{% if x.date|date:"m" == "07" %}Июля{% endif %}
{% if x.date|date:"m" == "08" %}Августа{% endif %}
{% if x.date|date:"m" == "09" %}Сентября{% endif %}
{% if x.date|date:"m" == "10" %}Октября{% endif %}
{% if x.date|date:"m" == "11" %}Ноября{% endif %}
{% if x.date|date:"m" == "12" %}Декабря{% endif %}
</span>
<span class="mec-date3">{{x.date|date:"Y"}}</span>
</div>
<div class="mec-event-title-link">
<h4 class="mec-event-title">{{x.namedate}} {{x.date|date:" (H:i)"}}</h4>
<div class="mec-event-countdown">
<div class="blockl">
<p class="texth" id="days"></p>
<p class="label-w">дни</p>
</div>
<div class="block-w">
<p class="texth" id="hours"></p>
<p class="label-w">часы</p>
</div>
<div class="block-w">
<p class="texth" id="minutes"></p>
<p class="label-w">минуты</p>
</div>
<div class="block-w">
<p class="texth" id="seconds"></p>
<p class="label-w">секунды</p>
</div>
</div>
</div>
</div>
</div>
<img src="{% static 'image/bible.jpg' %}" class="post-image"></img>
</article>
</div>
<script>
function makeTimer() {
var endTime=new Date({{ x.date|date:"U" }} * 1000);
endTime = (Date.parse(endTime) / 1000);
var now = new Date();
now = (Date.parse(now) / 1000);
var timeLeft = endTime - now;
var days = Math.floor(timeLeft / 86400);
var hours = Math.floor((timeLeft - (days * 86400)) / 3600);
var minutes = Math.floor((timeLeft - (days * 86400) - (hours * 3600 )) / 60);
var seconds = Math.floor((timeLeft - (days * 86400) - (hours * 3600) - (minutes * 60)));
if (hours < "10") { hours = "0" + hours; }
if (minutes < "10") { minutes = "0" + minutes; }
if (seconds < "10") { seconds = "0" + seconds; }
$("#days").html(days + "<span></span>");
$("#hours").html(hours + "<span></span>");
$("#minutes").html(minutes + "<span></span>");
$("#seconds").html(seconds + "<span></span>");
}
setInterval(function() { makeTimer(); }, 1000);
</script>
{% endif %}
{% endif %}
{% endwith %}
{% endfor %}
Views.py
from django.shortcuts import render, redirect
from .models import Event
from datetime import date
def index(request):
date = Event.objects.all()
content = {"date": date}
return render(request, 'Главная/Главная.html', content)
Models.py
from django.db import models
import os
class Event(models.Model):
namedate = models.CharField(max_length=120)
date = models.DateTimeField()
def __str__(self):
return self.namedate
Моя проблема решилась. Этот код помог мне:
Views.py
from datetime import datetime, timedelta
def index(request):
startdate = datetime.today()
enddate = startdate + timedelta(days=365)
date = Event.objects.filter(date__range=[startdate, enddate])
content = {"date": date}
return render(request, 'Главная/Главная.html', content)
template and JS
{% if forloop.counter0 == 0 %}
...
if (days < "0" ) {
location.reload(); return false;
}