Evgenii Legotckoi
Evgenii LegotckoiҚыр. 21, 2016, 12:12 Т.Қ.

Django - Оқулық 007. Django-bootstrap3 негізіндегі беттеуді қосу

Жаңа сайттағы мақалалар саны 10 данаға жақындай бастады, сондықтан мен сайттағы беттерді айналдыру үшін шұғыл түрде Pagination қостым. Бірақ django-bootstrap3 модулі бұрыннан қолданыста болғандықтан, бұл модульден Беттеу де пайдаланылады. Неліктен бәрі жасалған болса, қосымша жұмыс істеу керек? Солай емес пе.

Пагинация қосу үшін сізге қажет:

  1. django.core.pagination; сайтындағы Paginator сыныбын пайдаланыңыз;
  2. Басты бет шаблонын қосу bootstrap_pagination байланыстырумен ;
  3. Ағымдағы бет нөміріне чек қосыңыз;
  4. Және... url үлгілеріне жаңа ештеңе қоспаңыз.

Көрініске пагинаторды қосу

Paginator — page() әдісі шақырылғанда жүктелетін, бет нөмірі аргумент ретінде берілетін ағымдағы бетті қамтитын сынып. Біздің жағдайда біз осы беттің нөмірін алуға тырысамыз, егер ол бар болса, біз бетті көрсетеміз немесе егер біз беттердің санынан асып кеткен болсақ, соңғысын көрсетеміз. Егер нөмір берілмесе, бірінші бетті қайтарыңыз.

from django.shortcuts import render\_to\_response
from django.views import View
from django.core.paginator import Paginator

from knowledge.models import *

# Представление сделано на основе класса View
class EIndexView(View):

    def get(self, request):
        context = {}
        # Забираем все опубликованные статье отсортировав их по дате публикации
        all\_articles = Article.objects.filter(article\_status=True).order\_by('-article\_date')
        # Создаём Paginator, в который передаём статьи и указываем, 
        # что их будет 10 штук на одну страницу
        current\_page = Paginator(all\_articles, 10)

        # Pagination в django\_bootstrap3 посылает запрос вот в таком виде:
        # "GET /?page=2 HTTP/1.0" 200,
        # Поэтому нужно забрать page и попытаться передать его в Paginator, 
        # для нахождения страницы
        page = request.GET.get('page')
        try:
            # Если существует, то выбираем эту страницу
            context['article\_lists'] = current\_page.page(page)  
        except PageNotAnInteger:
            # Если None, то выбираем первую страницу
            context['article\_lists'] = current\_page.page(1)  
        except EmptyPage:
            # Если вышли за последнюю страницу, то возвращаем последнюю
            context['article\_lists'] = current\_page.page(current\_page.num\_pages) 

        return render\_to\_response('home/index.html', context)

URL үлгісі туралы ақпарат

Мен айтқанымдай, мен url үлгісін өзгерткен жоқпын, бірақ түсінбеушілік болмас үшін оны қосамын.

from django.conf.urls import url

from . import views

app\_name = 'home'
urlpatterns = [
    url(r'^$', views.EIndexView.as\_view(), name='index'),
]

Бет үлгісін теңшеу

Үлгі home/base.html ішінен мұраланады және бұл жағдайда қызық емес тақырып ақпаратын және т.б. қамтиды.

Шын мәнінде, таңдалған беттері бар Пагинатор нысаны мәтінмәнге жіберілді, содан кейін нысандардың әдеттегі сұраулар жинағы сияқты, цикл арқылы мақалалар арнасына кеңейтілді.

Ең қызығы, біз bootstrap3 модулін жүктейміз және оған контекст ретінде бірдей **мақала_тізімдерін бере отырып, bootstrap_pagination енгіземіз.

{% extends 'home/base.html' %}
{% block page %}
    <h1>Публикации</h1>
    {% if article\_lists %}
        {% for article in article\_lists %}
            <article>
                <a href="{{ article.get\_absolute\_url }}">
                    <h2>{{ article.article\_title }}</h2>
                </a>
                {{ article.desctription|safe }}
                <p><a class="btn btn-default btn-sm" href="{{ article.get\_absolute\_url }}">Читать далее</a></p>
                {% include 'knowledge/article\_footer.html' %}
            </article>
        {% endfor %}
    {% endif %}
{% load bootstrap3 %}
{% bootstrap\_pagination article\_lists %}
{% endblock %}

Django үшін Timeweb хостының VDS-сервері ұсынамын.

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

Вадим Полшков
  • Қаз. 8, 2018, 6:36 Т.Ж.

Как вы в своем шаблоне сделали в пагинации отображение 5 страниц потом ... и последние страницы?

Я тоже так хочу сделать, но у меня пока что все страницы выводит. Вот мой код в шаблоне

														<div class="col-xs-5">
															<div class="pagination">
																<ul>
                                                                    {% if product.has_previous %}
																	<li><a href="?page=1{{ product.previous.num_pages }}"><|</a></li>
																	<li><a href="?page={{ product.previous_page_number }}"><</a></li>
                                                                    {% endif %}

                                                                    {% for i in product.paginator.page_range %}
                                                                      {% if product.number == i %}
                                                                        <li class="active"><a href="">{{ i }}</a></li>
                                                                      {% else %}
                                                                        <li><a href="?page={{ i }}">{{ i }}</a></li>
                                                                      {% endif %}
                                                                    {% endfor %}

                                                                    {% if product.has_next %}
																	<li><a href="?page={{ product.next_page_number }}">></a></li>
																	<li><a href="?page={{ product.paginator.num_pages }}">>|</a></li>
                                                                    {% endif %}
																</ul>
														    </div>
														</div>

Evgenii Legotckoi
  • Қаз. 8, 2018, 7:09 Т.Ж.

я использую django-bootstrap4 и там уже есть эта возможность, поэтому выглядеть будет так в коде

{% bootstrap_pagination article_lists pages_to_show=5 %}

Просто поиграйтесь со значением pages_to_show

Вадим Полшков
  • Қаз. 8, 2018, 12:24 Т.Қ.

спасибо, получилось у меня на bootstrap3 тоже самое.

Плохо, что нет возможности отредактировать свой пост после публикации я там не правильно выбрал стиль кода.

Evgenii Legotckoi
  • Қаз. 9, 2018, 3:06 Т.Ж.

я добавлю редактирование ))) просто сейчас занят совсем другим функционалом. Для добавления редактирования нужно разработать единый механизм, который бы позволял использовать один Дженерик для разных типов контента, поскольку таких комментариев под разными видами контента будет тьма.

Вадим Полшков
  • Қаз. 9, 2018, 3:56 Т.Ж.

понятно.
Еще вопрос по пагинации. У меня она работает, но я так и не понял, как у вас меняется страница автоматом т.е. если сейчас выведено с 1 по 5 то после нажатия на 4 автоматом справа появляется 5? У меня сейчас в этом же порядке, чтоб попасть на 5 нужно нажать на три точки блин ...

Evgenii Legotckoi
  • Қаз. 9, 2018, 4:01 Т.Ж.

Не понял вопроса... В смысле меняется без перезагрузки всей страницы? или что именно?

Я гляну код, как на сайте сделано, но после работы. я не помню всех параметров которые там прописываю... Хотя того, что я вам написал должно быть достаточно...

У меня как бы тоже при выведенных от 1 до 4 нужно нажать на три точки, чтобы попасть на 5ю страницу.


Вадим Полшков
  • Қаз. 9, 2018, 4:13 Т.Ж.

У вас после нажатия на 4стр. 5 появляется сразу после обновления страницы. А у меня после нажатия на 4стр. и обновления страницы 5 не появляется а только ... и поэтому, что перейти на страницу 5 мне нужно нажать на многоточее.
Т.е. у вас не нужно нажимать на ... т.к. следующая цифра страницы сразу появляется. Вот как это работает пока не понял.

Evgenii Legotckoi
  • Қаз. 9, 2018, 4:21 Т.Ж.

Полагаю, что у вас отсутствует компонент page или каким-то образом номер страницы неправильно устанавливается... Либо, возможно имеете забагованную версию django-bootstrap3, тоже может быть ...

Вадим Полшков
  • Қаз. 9, 2018, 4:38 Т.Ж.

у меня сейчас так в коде шаблона, не знаю у вас так же или нет? или я может чет упустил?

Evgenii Legotckoi
  • Қаз. 9, 2018, 4:39 Т.Ж.

покажите python код, больше похоже на то, что у вас сам объект products корявый

Вадим Полшков
  • Қаз. 9, 2018, 4:49 Т.Ж.

вот эта функция, делал по документации джанго

def shop(request):
    context = {}
    products = Product.objects.filter(is_active=True)
    brands = Brand.objects.all()
    paginator = Paginator(products, 1)
    page = request.GET.get('page')
    products = paginator.get_page(page)
    context['products'] = products
    context['brands'] = brands
    return render(request, 'shop/shop.html', context)
Evgenii Legotckoi
  • Қаз. 9, 2018, 4:55 Т.Ж.

хм... я гляну после работы, что у меня там в коде есть, я для пагинации уже давно дженерик написал и код для пагинации уже не пишу, поэтому там, возможно, есть нюанс, о котором я забыл, который касается django-bootstrap*.


Вадим Полшков
  • Қаз. 9, 2018, 4:58 Т.Ж.

ага, спасибо буду ждать ответ.

Evgenii Legotckoi
  • Қаз. 9, 2018, 5:02 Т.Ж.

Погоди-те как... А вас шаблон неправильный...

<div class="pagination">

Там точно не нужен, поскольку bootstrap_pagination генерирует всё, что нужно.

Вот минимально рабочий вариант пагинатора со списком объектов

<div id="articles-list">
    {% load bootstrap_pagination from bootstrap3 %}
    {% for article in object_list %}
        {% include 'knowledge/article_preview.html' %}
    {% endfor %}
    {% bootstrap_pagination object_list pages_to_show="10" %}
</div>

Код взят вот из этой статьи


Вадим Полшков
  • Қаз. 9, 2018, 5:44 Т.Ж.

У вас на той странице написано

article_preview.html - этот шаблон рассматривать не будем, поскольку он не интересен для нас в данном случае
наверно как раз это самое интересное будет в моем случае, могу предположить, что там сам код пагинации, по которому проходит итерация. Можно его посмотреть?

Evgenii Legotckoi
  • Қаз. 9, 2018, 5:52 Т.Ж.

Нету там никакой пагинации от слова - "совсем". Там просто кусок шаблона который отвечает за отрисовку превью одного объекта статьи.

Вот в этой одной строчке вся пагинация

{% bootstrap_pagination object_list pages_to_show="10" %}


Вадим Полшков
  • Қаз. 9, 2018, 5:58 Т.Ж.

понял, ок пошаманю еще немного, если не получиться то и фиг с ним так тоже вполне сойдет.

Вадим Полшков
  • Қаз. 9, 2018, 6:20 Т.Ж.

В общем добился я такого эффекта в пагинации как у вас след.образом. У меня в категории к примеру 8 записей, вот чтоб пагинация так работала нужно в {% bootstrap_pagination products pages_to_show=4 %} поставить ровно половину т.е. скрывать 4стр. Теперь получается, что видимых 5стр. и если нажать на 5 то 6-я автоматом и появляется и т.д. как у вас.
Спасибо за помощь!

Evgenii Legotckoi
  • Қаз. 9, 2018, 6:23 Т.Ж.

А, вот в чём дело было... получается, что у вас просто контента не хватало, чтобы был задействован весь функционал пагинатора

Вадим Полшков
  • Қаз. 9, 2018, 6:32 Т.Ж.

получается да, сейчас делаю новый проект и пока много не добавлял контента так чисто для проверки и тестов, но когда ограничил ровно на половину, то заработало как надо.

RS
  • Қыр. 1, 2021, 3:45 Т.Қ.
  • (өңделген)

а как быть если нет базы и запроса в БД, а данные приходят по запросу в api стороннего сервера, а клиент серверное приложение на django и я хочу реализовать пагинацию на стороне django. В апи я могу пердвать limit, offset, и получать count всех записей
Что тогда нужно передавать в класс пагинатора (вместо all_articles) как тут

кроме количества записей на страницы и как в дальнейшем делать запрос что бы пагинатор работал правильно

Evgenii Legotckoi
  • Қаз. 12, 2021, 1:45 Т.Ж.

Просто список каких-нибудь объектов передавайте, который дёрнули ищ api стороннего сервера

from django.core.paginator import Paginator
objects = ['john', 'paul', 'george', 'ringo']
p = Paginator(objects, 2)

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз
AD

C++ - Тест 004. Указатели, Массивы и Циклы

  • Нәтиже:50ұпай,
  • Бағалау ұпайлары-4
m
  • molni99
  • Қаз. 26, 2024, 1:37 Т.Ж.

C++ - Тест 004. Указатели, Массивы и Циклы

  • Нәтиже:80ұпай,
  • Бағалау ұпайлары4
m
  • molni99
  • Қаз. 26, 2024, 1:29 Т.Ж.

C++ - Тест 004. Указатели, Массивы и Циклы

  • Нәтиже:20ұпай,
  • Бағалау ұпайлары-10
Соңғы пікірлер
ИМ
Игорь МаксимовҚар. 22, 2024, 11:51 Т.Ж.
Django - Оқулық 017. Теңшелген Django кіру беті Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii LegotckoiҚаз. 31, 2024, 2:37 Т.Қ.
Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZEҚаз. 19, 2024, 8:19 Т.Ж.
Qt Creator көмегімен fb3 файл оқу құралы Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь МаксимовҚаз. 5, 2024, 7:51 Т.Ж.
Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas5Шілде 5, 2024, 11:02 Т.Ж.
QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Енді форумда талқылаңыз
m
moogoҚар. 22, 2024, 7:17 Т.Ж.
Mosquito Spray System Effective Mosquito Systems for Backyard | Eco-Friendly Misting Control Device & Repellent Spray - Moogo ; Upgrade your backyard with our mosquito-repellent device! Our misters conce…
Evgenii Legotckoi
Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
t
tonypeachey1Қар. 15, 2024, 6:04 Т.Ж.
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
NSProject
NSProjectМаусым 4, 2022, 3:49 Т.Ж.
Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…

Бізді әлеуметтік желілерде бақылаңыз