Как исправить дублирование при автоматической пагинации?
Есть шаблон home.html и home_list.html;
в home_list.html Json формат успешно передается, а вот Ajax хулиганит и при автоматической пагинации создает кучу повторных постов;
как исправить?
<script>
$(document).ready(function(){
var nextPageUrl = '/load-posts/'; // Используем URL для загрузки постов
function loadMorePosts() {
// Показываем элемент загрузки
//$('#loading').text('Загрузка...');
// Выполняем GET запрос к серверу
$.get(nextPageUrl, function(data) {
// Скрываем элемент загрузки
//$('#loading').text('Загрузить еще');
// Добавляем HTML с постами в конец контейнера
$('#post_contenter').append(data.posts_html);
// Обновляем URL следующей страницы
nextPageUrl = data.next_page_url;
}).fail(function() {
// Обрабатываем ошибку запроса, если она произошла
console.error('Ошибка при загрузке постов');
// Скрываем элемент загрузки
$('#loading').hide();
});
}
// Обработчик события прокрутки страницы
$(window).scroll(function() {
if($(window).scrollTop() + $(window).height() >= $(document).height()) {
// Вызываем функцию загрузки дополнительных постов
loadMorePosts();
}
});
// Инициализация загрузки первой страницы постов при загрузке страницы
loadMorePosts();
});
</script>
представление:
from django.shortcuts import render, redirect
from usercreatepost.forms import PostForm
from publication.models import Userpublication
from user.models import Profile****, Subscription
from django.contrib.auth.decorators import login_required
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from django.urls import reverse
from django.http import JsonResponse
from django.template.loader import render_to_string
from django.db.models import Q
@login_required
def create_post(request):
form = PostForm(request.POST or None)
# Если запрос - POST, сохраняем форму
if request.method == 'POST':
if form.is_valid():
post = form.save(commit=False)
post.author = request.user
post.save()
return redirect('home')
# Получаем ID пользователей, на которых подписан текущий пользователь
subscribed_user_ids = Subscription.objects.filter(subscriber=request.user).values_list('target_user', flat=True)
# Получаем все посты авторов, на которых подписан текущий пользователь
subscribed_posts = Userpublication.objects.filter(author__in=subscribed_user_ids)
# Получаем все посты текущего пользователя
own_posts = Userpublication.objects.filter(author=request.user)
# Объединяем списки постов
all_posts = (subscribed_posts | own_posts).order_by('-time_create')
# Получаем объект страницы постов для отображения
page_posts = all_posts
context = {'form': form, 'post_lists': page_posts, 'title': '**** | Новости'}
return render(request, '****/home.html', context)
def load_posts(request):
# Получаем номер страницы из запроса
page_number = request.GET.get('page', 1) # Устанавливаем значение по умолчанию на 1
# Получаем ID пользователей, на которых подписан текущий пользователь
subscribed_user_ids = Subscription.objects.filter(subscriber=request.user).values_list('target_user', flat=True)
# Получаем все посты, на которых подписан текущий пользователь или которые он написал
all_posts = Userpublication.objects.filter(Q(author__in=subscribed_user_ids) | Q(author=request.user))
# Создаем объект Paginator
paginator = Paginator(all_posts, 10) # 10 постов на страницу
try:
# Получаем объекты для текущей страницы
current_page_posts = paginator.page(page_number)
except PageNotAnInteger:
# Если номер страницы не является целым числом, показываем первую страницу
current_page_posts = paginator.page(1)
except EmptyPage:
# Если номер страницы находится за пределами допустимого диапазона, возвращаем пустой ответ
return JsonResponse({'posts_html': '', 'next_page_url': None})
# Рендерим HTML с постами текущей страницы
posts_html = render_to_string('****/home_list.html', {'posts': current_page_posts})
# Получаем URL для следующей страницы, если она существует
next_page_url = None
if current_page_posts.has_next():
next_page_url = f"{reverse('load_posts')}?page={current_page_posts.next_page_number()}"
# Возвращаем JSON-ответ с HTML и URL следующей страницы
return JsonResponse({'posts_html': posts_html, 'next_page_url': next_page_url})