Как сделать фильтрацию постов по датам, которые постоянно будут меняться (как на сайте погоды)?
Моя задача: Сделать фильтрацию постов, через кнопки с датами.
Вот кнопки с датами:
А ниже должны располагаться некие посты и у каждого поста есть "дата публикации", на основе которой он отобразится.
Вот контекст:
class PostListView(ListView): model = Post template_name = 'main/main.html' context_object_name = 'posts' def get_queryset(self): profile_list = Profile.objects.filter(address=self.request.user.profile.address) # Получили список нужных нам # профилей, здесь всё Ок, на это внимание не обращать queryset = Post.objects.filter(author__profile__in=profile_list).order_by('-date_posted') # Получ нужные posts, здесь тоже всё Ок # Дальше я не знаю как и что делать, чтобы выполнить конечную <b>Задачу</b> date_deli = (datetime.datetime.now() + datetime.timedelta(days=0)).date() # Сегодняшняя дата if self.request.POST.get('0'): date_deli = (datetime.datetime.now() + datetime.timedelta(days=0)).date() elif self.request.POST.get('1'): date_deli = (datetime.datetime.now() + datetime.timedelta(days=1)).date() elif self.request.POST.get('2'): date_deli = (datetime.datetime.now() + datetime.timedelta(days=2)).date() queryset = queryset.filter(date_deliver=date_deli) # Достаем все посты с данной датой return queryset |
class PostListView(ListView): model = Post template_name = 'main/main.html' context_object_name = 'posts' def get_queryset(self): profile_list = Profile.objects.filter(address=self.request.user.profile.address) # Получили список нужных нам # профилей, здесь всё Ок, на это внимание не обращать queryset = Post.objects.filter(author__profile__in=profile_list).order_by('-date_posted') # Получ нужные posts, здесь тоже всё Ок # Дальше я не знаю как и что делать, чтобы выполнить конечную <b>Задачу</b> date_deli = (datetime.datetime.now() + datetime.timedelta(days=0)).date() # Сегодняшняя дата if self.request.POST.get('0'): date_deli = (datetime.datetime.now() + datetime.timedelta(days=0)).date() elif self.request.POST.get('1'): date_deli = (datetime.datetime.now() + datetime.timedelta(days=1)).date() elif self.request.POST.get('2'): date_deli = (datetime.datetime.now() + datetime.timedelta(days=2)).date() queryset = queryset.filter(date_deliver=date_deli) # Достаем все посты с данной датой return queryset
А вот, на всякий случай, код этих кнопок:
<div class="row"> <h3>{{ 0|addDays|date:"F" }}</h3> <div class="col"> <p>{{ 0|addDays|date:"D" }}</p> <a href=""><button type="button" name="0" class="btn btn-primary">{{ 0|addDays|date:"j" }}</button></a> </div> <div class="col"> <p>{{ 1|addDays|date:"D" }}</p> <a href=""><button type="button" name="1" class="btn btn-primary">{{ 1|addDays|date:"j" }}</button></a> </div> <div class="col"> <p>{{ 2|addDays|date:"D" }}</p> <a href=""><button type="button" name="2" class="btn btn-primary">{{ 2|addDays|date:"j" }}</button></a> </div> <div class="col"> <p>{{ 3|addDays|date:"D" }}</p> <a href=""><button type="button" class="btn btn-primary">{{ 3|addDays|date:"j" }}</button></a> </div> <div class="col"> <p>{{ 4|addDays|date:"D" }}</p> <a href=""><button type="button" class="btn btn-primary">{{ 4|addDays|date:"j" }}</button></a> </div> <div class="col"> <p>{{ 5|addDays|date:"D" }}</p> <a href=""><button type="button" class="btn btn-primary">{{ 5|addDays|date:"j" }}</button></a> </div> <div class="col"> <p>{{ 6|addDays|date:"D" }}</p> <a href=""><button type="button" class="btn btn-primary">{{ 6|addDays|date:"j" }}</button></a> </div> </div> |
<div class="row"> <h3>{{ 0|addDays|date:"F" }}</h3> <div class="col"> <p>{{ 0|addDays|date:"D" }}</p> <a href=""><button type="button" name="0" class="btn btn-primary">{{ 0|addDays|date:"j" }}</button></a> </div> <div class="col"> <p>{{ 1|addDays|date:"D" }}</p> <a href=""><button type="button" name="1" class="btn btn-primary">{{ 1|addDays|date:"j" }}</button></a> </div> <div class="col"> <p>{{ 2|addDays|date:"D" }}</p> <a href=""><button type="button" name="2" class="btn btn-primary">{{ 2|addDays|date:"j" }}</button></a> </div> <div class="col"> <p>{{ 3|addDays|date:"D" }}</p> <a href=""><button type="button" class="btn btn-primary">{{ 3|addDays|date:"j" }}</button></a> </div> <div class="col"> <p>{{ 4|addDays|date:"D" }}</p> <a href=""><button type="button" class="btn btn-primary">{{ 4|addDays|date:"j" }}</button></a> </div> <div class="col"> <p>{{ 5|addDays|date:"D" }}</p> <a href=""><button type="button" class="btn btn-primary">{{ 5|addDays|date:"j" }}</button></a> </div> <div class="col"> <p>{{ 6|addDays|date:"D" }}</p> <a href=""><button type="button" class="btn btn-primary">{{ 6|addDays|date:"j" }}</button></a> </div> </div>
Дополнительно:
Кнопки сделать ссылками, на ссылку повесить
<a href="?date=2023-05-01">23 мая</a>
На вьюехе взять из параметра дату
date = self.request.GET.get("date",dt.date.today()) qs = Post.objects.filter(date_deliver=date) |
date = self.request.GET.get("date",dt.date.today()) qs = Post.objects.filter(date_deliver=date)
p.s. пример упрощен. Его нужно доделать
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос

Для реализации фильтрации постов по датам, которые постоянно меняются, как на сайте погоды, вам понадобится использовать динамический подход. Вам нужно будет создать функцию, которая будет получать текущую дату и время, а затем сравнивать её с датой и временем каждого поста для определения их актуальности.
Прежде всего, вам необходимо хранить дату и время каждого поста в базе данных или в массиве, в зависимости от того, как вы храните данные на вашем сайте. После этого вы можете создать функцию, которая будет отображать только те посты, у которых дата публикации не превышает текущую дату и время.
Пример реализации на PHP:
function filterPostsByDate($posts) { $filteredPosts = array(); $currentDateTime = date('Y-m-d H:i:s'); foreach($posts as $post) { if($post['publish_date'] 'Post 1', 'content' => 'Content 1', 'publish_date' => '2022-01-01 12:00:00'), array('title' => 'Post 2', 'content' => 'Content 2', 'publish_date' => '2022-01-02 15:30:00'), array('title' => 'Post 3', 'content' => 'Content 3', 'publish_date' => '2022-01-03 10:45:00') ); $filteredPosts = filterPostsByDate($posts); foreach($filteredPosts as $post) { echo '<h2>' . $post['title'] . '</h2>'; echo '<p>' . $post['content'] . '</p>'; }
Этот код сначала определяет текущую дату и время, затем проходит по всем постам и добавляет только те, у которых дата публикации не превышает текущую дату и время, в новый массив $filteredPosts. Наконец, он выводит отфильтрованные посты на экран.
Таким образом, вы сможете реализовать фильтрацию постов по датам, которые постоянно меняются, на вашем сайте, как это делается на сайте погоды.