@nikidreiks

Пагинация постов в Django, как исправить?

Как исправить дублирование при автоматической пагинации?
Есть шаблон 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})
  • Вопрос задан
  • 98 просмотров
Решения вопроса 1
@chemdev
// Инициализация загрузки первой страницы постов при загрузке страницы
        loadMorePosts();


Эта строка вызывает дублирование.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы