Для настройки пагинации постов в Django вы можете использовать встроенные функции пагинации, предоставляемые Django:
1. В вашем представлении (view) необходимо использовать класс Paginator, чтобы разбить данные на страницы:
```python
from django.core.paginator import Paginator
def post_list(request):
posts = Post.objects.all()
paginator = Paginator(posts, 10) # Пагинация по 10 постов на страницу
page_number = request.GET.get('page')
page_obj = paginator.get_page(page_number)
return render(request, 'post_list.html', {'page_obj': page_obj})
```
2. В шаблоне (template) post_list.html используйте объект page_obj для отображения постов на странице и элементов пагинации:
```html
{% for post in page_obj %}
<!-- Отображение поста -->
{% endfor %}
<div class="pagination">
<span class="step-links">
{% if page_obj.has_previous %}
<a href="?page=1">« первая</a>
<a href="?page={{ page_obj.previous_page_number }}">предыдущая</a>
{% endif %}
<span class="current">
Страница {{ page_obj.number }} из {{ page_obj.paginator.num_pages }}.
</span>
{% if page_obj.has_next %}
<a href="?page={{ page_obj.next_page_number }}">следующая</a>
<a href="?page={{ page_obj.paginator.num_pages }}">последняя »</a>
{% endif %}
</span>
</div>
```
3. Чтобы избавиться от дублирования постов при использовании Ajax запросов, убедитесь, что при каждом запросе вы добавляете новые посты, а не заменяете текущие. Например, вы можете использовать атрибут data-page в вашем Ajax запросе и передавать номер страницы для подгрузки:
```javascript
var currentPage = 1;
function loadMorePosts() {
$.ajax({
url: '/post_list/',
data: {
'page': currentPage
},
success: function(data) {
for (var i = 0; i < data.length; i++) {
// Добавление новых постов на страницу
}
currentPage++;
}
});
}
```
Таким образом, при каждом Ajax запросе вы будете добавлять новые посты на страницу, а не заменять текущие, что поможет избежать дублирования постов.