Сейчас я пытаюсь создать пагинатор django с помощью ajax. Я только что попробовал простой способ, используя $('#div_id').load()
для загрузки списков статей. Но проблема моего кода в том, что пагинатор не обновлялся, а это значит, что если у меня есть пагинатор типа "1,2,3,...,9,10", я могу загружать списки статей только со страницы 1,2, 3,9,10 и я не могу загрузить списки с 4 по 8 потому что в пагинаторе нет номеров страниц. Итак, как я могу решить эту проблему?
Мой код View.py:
class IndexView(ListView):
model = Article
template_name = "articles.html"
context_object_name = "article_list"
paginate_by = 2
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
paginator = context.get('paginator')
page = context.get('page_obj')
is_paginated = context.get('is_paginated')
pagination_data = self.pagination_data(paginator, page, is_paginated)
context.update(pagination_data)
return context
def pagination_data(self, paginator, page, is_paginated):
if not is_paginated:
return {}
left = []
right = []
left_has_more = False
right_has_more = False
first = False
last = False
page_now = page.number
page_total = paginator.num_pages
page_range = paginator.page_range
if page_now == 1:
right = page_range[page_now:page_now + 2]
if right[-1]<page_total - 1:
right_has_more = True
if right[-1]<page_total:
last = True
elif page_now == page_total:
left = page_range[(page_now - 3) if (page_now - 3) > 0 else 0:page_now - 1]
if left[0] > 2:
left_has_more = True
if left[0] > 1:
first = True
else:
left = page_range[(page_now - 3) if (page_now - 3) > 0 else 0:page_now - 1]
right = page_range[page_now:page_now + 2]
if right[-1] < page_total - 1:
right_has_more = True
if right[-1] < page_total:
last = True
if left[0]>2:
left_has_more = True
if left[0] > 1:
first = True
page_data = {
'left':left,
'right':right,
'left_has_more':left_more,
'right_has_more':right_more,
'first':first,
'last':last
}
return page_data
и мой html тело:
{% if is_paginated %}
<div class = "ui pagination menu" id = "p_manu_num">
{% if first %}
<a class = "item" name = "1">1</a>
{% endif %}
{% if left %}
{% if left_more %}
<div class = "disabled item">...</div>
{% endif %}
{% for i in left %}
<a class = "item" name = "{{ i }}">{{ i }}</a>
{% endfor %}
{% endif %}
<a class = "item active" id = "act" name = "{{ page_obj.number }}"><b>{{ page_obj.number }}</b></a>
{% if right %}
{% for j in right %}
<a class = "item" name = "{{ j }}">{{ j }}</a>
{% endfor %}
{% if right_more %}
<div class = "disabled item">...</div>
{% endif %}
{% endif %}
{% if last %}
<a class = "item" name = "{{ paginator.num_pages }}">{{ paginator.num_pages }}</a>
{% endif %}
</div>
{% endif %}
мой HTML-скрипты:
$('#p_manu_num a').on('click', function () {
var art_url = "?page = " + $(this).attr('name') +" #blog_content_arts"
$('#blog_content_arts').load(art_url).transition('fade in')
})
Я буду очень признателен, если вы можете мне помочь!
Не нужно изобретать велосипед! Django имеет встроенную разбивку на страницы, которая значительно облегчит выполнение того, что вы пытаетесь сделать.
Взгляните на это: https://docs.djangoproject.com/en/2.2/topics/pagination/#using-paginator-in-a-view
Вы можете использовать код в примере для рендеринга response
, а затем добавить его в DOM с помощью JS.
Поскольку этот вопрос был просмотрен более 1000 раз, я пришел, чтобы ответить на этот вопрос сам, надеюсь, что эта небольшая демонстрация поможет читателям:
Демонстрационный код выглядит следующим образом:
View.py
def test(request):
objs = Article.objects.all()
page = request.GET.get('page', 1)
paginator = Paginator(objs, 1) #number means items per page
try:
sets = paginator.page(page)
except PageNotAnInteger:
sets = paginator.page(1)
except EmptyPage:
sets = paginator.page(paginator.num_pages)
return render(request, 'test.html', {'sets':sets})
test.html
<div id = "box">
{% for item in sets %}
{{ item.Title }}
{% empty %}
Nothing.
{% endfor %}
{% if sets.has_previous %}
<button id = "previous_button">Previous</button>
{% else %}
<button disabled>Prvious</button>
{% endif %}
{% if sets.has_next %}
<button id = "next_button">Next</button>
{% else %}
<button disabled>Next</button>
{% endif %}
</div>
Скрипт
$('#next_button').on('click', function () {
{% if sets.has_next %}
page = {{ sets.next_page_number }};
{% endif %}
$.ajax({
type: "GET",
url: './',
data: {
page: page
},
success: function (data) {
$('#box').html(data)
},
});
});
$('#previous_button').on('click', function () {
{% if sets.has_previous %}
page = {{ sets.previous_page_number }};
{% endif %}
$.ajax({
type: "GET",
url: './',
data: {
page: page
},
success: function (data) {
$('#box').html(data)
},
});
});