Форум сайта python.su
Подскажите пожалуйста такой момент. Как мне получить значение именованного аргумента из url'а в ListView, не могу понять что не так…
urls.py:
urlpatterns = [ url(r'^page/(?P<num_page>\d+)/$', view.ArticlesMain.as_view(), name="articles_main"), url(r'^$', view.ArticlesMain.as_view(), name="articles_main"), ]
class ArticlesMain(ListView): template_name = "articles_main.html" model = Article paginate_by = 1 page_kwarg = "num_page" context_object_name = "articles" def get_context_data(self, **kwargs): context = super(ArticlesMain, self).get_context_data(**kwargs) articles = Article.objects.all() paginator = Paginator(articles, self.paginate_by) try: page_num = self.request.GET.get("num_page") except KeyError: page_num = 1 try: articles_page = paginator.page(page_num) except InvalidPage: articles_page = paginator.page(1) #pages - переменная, которая передается в шаблон и формирует вид переключателя страниц pages = [] curr_page = articles_page.number range_page = paginator.page_range number_pages = paginator.num_pages if number_pages >= 10 and curr_page >= 10: if curr_page >= range_page[-4]: pages.append(range_page[0]) pages.append('points') [pages.append(i) for i in range(range_page[-1] - 5, range_page[-1] + 1)] else: pages.append(range_page[0]) pages.append('points') [pages.append(i) for i in range(curr_page - 3, curr_page + 4)] pages.append('points') pages.append(range_page[-1]) if number_pages >= 10 > curr_page: [pages.append(i) for i in range(1, 11)] if number_pages != 11: pages.append('points') pages.append(range_page[-1]) if number_pages < 10 and curr_page < 10: [pages.append(i) for i in range_page] context["articles"] = articles context["articles_page"] = articles_page context["pages"] = pages return context
Отредактировано WalinoR (Фев. 4, 2016 14:48:36)
Офлайн
self.kwargs['num_page']
Офлайн
вот это да…
FishHook - спасибо тебе!
Офлайн
Офлайн
Офлайн
WalinoR
И это, как бы тебе сказать…
Ты неправильно CBV используешь. Совсем.
Офлайн
буду признателен, если объяснишь. я только учусь и поэтому буду рад любым советам
Офлайн
я гуглил про пагинатор, но там не рассматривается вопрос, что нужно менять вид переключателя в зависимости от выбранной текущей страницы. поэтому я формирую список page, а потом в шаблоне вывожу нужный вид:
{% block pagination %} {% if page_obj.paginator.num_pages > 1 %} <div class="pagination"> <ul> {% if page_obj.has_previous %} <a href="{% url "blog:articles_main" page_obj.previous_page_number %}"><li>←</li></a> {% else %} <li class="tree_point">←</li> {% endif %} {% for num in pages %} {% if num == 'points' %} <li class="tree_point">...</li> {% elif num == page_obj.number %} <li id="active">{{ num }}</li> {% else %} <a href="{% url "blog:articles_main" num %}"><li>{{ num }}</li></a> {% endif %} {% endfor %} {% if page_obj.has_next %} <a href="{% url "blog:articles_main" page_obj.next_page_number %}"><li>→</li></a> {% else %} <li class="tree_point">→</li> {% endif %} </ul> </div> {% endif %} {% endblock pagination %}
Отредактировано WalinoR (Фев. 4, 2016 15:40:13)
Офлайн
CBV - это дженерики, то есть готовые решения для стандартных задач.
Например, задача - отобразить список объектов решается стандартным классом ListView.
Для этого класс предоставляет набор специфических атрибутов и делает всю работу по подготовку списка, его паджинации и передаче его в контекст без лишних действий.
class ArticleListView(ListView): model = Article paginate_by = 10
Офлайн
Я понял, но если я так напишу и у меня допустим будет 100 страниц. То на сайте у меня будет 100 кнопок подряд для переключения страниц. Так вот где мне тогда написать логику, чтобы организовать такой переключатель, как я показал в предыдущем посте (ну или как на данном форуме). В шаблоне?
Офлайн