Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 4, 2016 16:02:25

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

ListView и именованный аргумент в url

Ну а где же писать логику отображения?



Офлайн

#2 Фев. 4, 2016 17:49:41

FooBar
От:
Зарегистрирован: 2009-01-10
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

ListView и именованный аргумент в url

WalinoR
Я понял, но если я так напишу и у меня допустим будет 100 страниц. То на сайте у меня будет 100 кнопок подряд для переключения страниц. Так вот где мне тогда написать логику, чтобы организовать такой переключатель, как я показал в предыдущем посте (ну или как на данном форуме). В шаблоне?
Могу подкинуть как сделано у меня. У меня в пагинаторе отображается 4 страницы назад от текущей и 4 вперед от текущей.

Тут я делаю наследование и добавляю/переопределяю некоторые методы.
from django.core.paginator import Paginator, Page


class MyPage(Page):
def range_before(self):
i = self.number - 4
if i <= 0:
i = 1
return range(i, self.number)

def range_after(self):
b = self.number + 1
e = b + 4
if e > self.paginator.num_pages:
e = self.paginator.num_pages + 1
return range(b, e)


class MyPaginator(Paginator):
def _get_page(self, *args, **kwargs):
return MyPage(*args, **kwargs)

Во вьюхе я создаю класс MyListView от которого уже произвожу все остальные с необходимой пагинацией.
from common.paginator import MyPaginator

class MyListView(ListView):
paginator_class = MyPaginator
paginate_by = PAGINATE_BY
context_object_name = 'albums'
sort_by_list = {
'id': 'Дата',
'hits': 'Просмотры',
#'comments': 'Комментарии'
}

def get_order(self):
self.sort_by = self.request.GET.get('sort_by', 'id')
if self.sort_by in self.sort_by_list:
return '-{}'.format(self.sort_by)
else:
self.sort_by = 'id'
return '-id'

def get_context_data(self, **kwargs):
context = super(MyListView, self).get_context_data(**kwargs)
if self.sort_by != 'id':
context['sort_by_param'] = 'sort_by={}&'.format(self.sort_by)
context['sort_by_name'] = self.sort_by_list[self.sort_by]
context['sort_by_list'] = self.sort_by_list
return context


class AlbumsList(MyListView):
template_name = 'albums/albums_list.html'

def get_queryset(self):
return Album.objects.order_by(self.get_order())

Ну и в шаблоне такое
{% if is_paginated %}
{% autoescape off %}
<ul class="pagination">
{% if page_obj.has_previous %}
<li>
<a href="?{{ sort_by_param }}page=1">
<span>Первая</span>
</a>
</li>
<li>
<a href="?{{ sort_by_param }}page={{ page_obj.previous_page_number }}">
<i class="icon-angle-left"></i>
</a>
</li>
{% for num in page_obj.range_before %}
<li>
<a href="?{{ sort_by_param }}page={{ num }}">{{ num }}</a>
</li>
{% endfor %}
{% endif %}
<li class="active">
<a href="#">{{ page_obj.number }}</a>
</li>
{% if page_obj.has_next %}
{% for num in page_obj.range_after %}
<li>
<a href="?{{ sort_by_param}}page={{ num }}">{{ num }}</a>
</li>
{% endfor %}
<li>
<a href="?{{ sort_by_param }}page={{ page_obj.next_page_number }}">
<i class="icon-angle-right"></i>
</a>
</li>
<li>
<a href="?{{ sort_by_param }}page=last">
<span>Последняя</span>
</a>
</li>
{% endif %}
</ul>
{% endautoescape %}
{% endif %}



Офлайн

#3 Фев. 16, 2016 21:10:04

WalinoR
От: Бердянск, Украина
Зарегистрирован: 2015-09-08
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

ListView и именованный аргумент в url

Спасибо за пример. сделал по аналогии, только с моим “видом” пагинации)))

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version