Step 3 (S-44805)

From Stepik Wiki
Revision as of 14:15, 6 August 2017 by Admin (Talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

Step on Stepik: https://stepik.org/lesson/14831/step/3

Step 3 (S-44805) 1.png

[00:00 - 00:18] придем а к следующей схеме следующему сценарию это отображение списка объектов помимо страница 1 поставлен нам хотелось бы иметь а на нашем сайте на вас в нашего приложения список постов


[00:18 - 00:36] причем очевидно что эти списки они будут разные разных видов пример самые популярные посты свежие посты и так далее и очевидно что если наш сайт более менее популярны эти а списки они не умещаются на 1 экране


[00:36 - 00:52] а давайте начнем с простейшего варианта а представим что у нас есть запрос на список просто всех постов опубликованных а


Step 3 (S-44805) 2.png

[00:52 - 01:10] порядок в данном случае для нас и вашим skype будет тот который предполагает модель по умолчанию он говорит что в модели есть специальный класс место в котором можно задать порядок порядок сортировки модель по умолчанию итак мы создаем


[01:10 - 01:24] специальный маршрут который ведет к нашей вьюшки вьюшки у нас называется list all а


[01:24 - 01:44] что мы должны получить в итоге мы должны а отрисовать страницу на странице должно быть какое то определенное количество а постов например 10 штук и должны быть специальные гиперссылки для а передвижения к следующим страница так называемый механизм


[01:44 - 02:03] пагинации постраничный отображения поэтому в шаблонизатор мы должны передать список объектов и специальные данные для механизма пагинации а с чего начинается наша вьюшки он начинается с того что происходит


[02:03 - 02:22] создание корень сайта а это основная выборка которые показывают какой нужен сам объект который показывает какой множество постов мы будем отображать в данном случае мы отображает все опубликованные посты а


[02:22 - 02:37] далее мы должны каким то образом определить постов много мы должны определить какую часть опубликованных постов мы отображаем для этого используются 2 get параметра лимит и по сч


[02:37 - 02:56] лимит передает редко обычно он использует используется значение по умолчанию 10 10 постов на страницу а параметров пыщ указывает такую страницу в листинге мы смотрим 1 страницу листинга 2 страницу листинг 3 страницы и так далее


[02:56 - 03:14] после того как у нас есть кое reset нашем случае это post и параметры пагинации это 2 переменные лимиты по речь создается специальный объект пагинатор


[03:14 - 03:33] а это не сложный объект который рассчитывает все необходимые параметры для постраничного отображения а вот эту строчку пока пропустят и значение объясню позже а


[03:33 - 03:48] после того как объект пагинатор создан мы получаем конкретную страницу то есть мы передаем параметр вызывает метод patch передаем ему номер страницы и в ответ получаем объект страница


[03:48 - 04:04] ну мы использовали то что мы имя переменной потому что ну в принципе адекватно отображает смысл того и другого но теперь у нас появиться уже стал специальным объектом а джанго core пагинатор точка page специальный класс объекта


[04:04 - 04:19] этого объекта есть метод обжит лист в котором будет находиться уже список постов относящихся к данной странице а и собственно говоря все эти 3 объекта мы передаем в наш шаблон


[04:19 - 04:34] то есть вот происходит вызов шаблонизатора мы передаем как список постов для отображения так объекты по еще под и новейшим для отрисовки а навигации


[04:34 - 04:49] как то был как нарисовать список самих постов понятно мы обсуждали этом примере а когда говорить а как выглядит а фрагмент шаблона который отвечает за


Step 3 (S-44805) 3.png

[04:49 - 05:04] отрисовку навигации в нашем случае мы использовали верстку из бутстрапа то есть


[05:04 - 05:19] в начале ну мы и проходим в цикле а по переменной по h re in пагинатор patch patch


[05:19 - 05:37] а в этой переменной содержится список всех страниц а которое будет отображаться рядом с текущей то есть r когда выбрали какую то страницу 55 в пагинатор показываются соседней странице вот они находятся в переменной по h range а


[05:37 - 05:56] далее мы проходим в цикле если номер страницы которой мы сейчас сводим совпадает с текущей страницы мы ставим есть специальный класс active чтобы а в приват и мы видели на какой странице мы в текущий момент находимся и дали нам нужно вывести а


[05:56 - 06:13] гиперссылку на определенную страницу на n ную страницу нашего listen это делается с помощью а гиперссылке но нам нужно знать какой то


[06:13 - 06:28] то есть а мы знаем что номер страницы мы знаем но нам нужно знать о какой то основной урон который этот номер страницы приклеить поэтому здесь используется переменная boys blue которую мы передали на предыдущем слайде


Step 3 (S-44805) 4.png

[06:28 - 06:47] вот указывается боюсь а перемены у нас здесь указан параметр к раз вопрос по сч а к этому параметру приклеивается номер страницы получается урл следующей странице


[06:47 - 07:05] таким образом у нас верстка пагинатора это просто список гиперссылок на нужную нам страницу а здесь сделаны не очень красиво у нас кто записан непосредственно в коде view причем он записан в виде строки


Step 3 (S-44805) 5.png

[07:05 - 07:21] использование реверс роутинг а мы захардкодили параметры но это было сделано общем то для уменьшения объема с ней то на практике конечно рекомендуется не итак мы рассмотрели


[07:21 - 07:39] вьюшку которая подготавливает данные и шаблон которая отрисовывает пагинатор то есть навигация для для для навигации для постраничной навигации


Step 3 (S-44805) 6.png

[07:39 - 07:58] а теперь давайте рассмотрим чуть поподробнее объекта пагинатора быч это 2 2 класса которые идут в комплекте с django они помогают нам 12 итак 1 это объект paginator


[07:58 - 08:15] пагинатора то точка входа механизмы пагинацией чтобы построить постраничный листинг к вам нужно во 1 получить некоторые queryset во 2 получить параметра п h и лимит в 3


Step 3 (S-44805) 7.png

[08:15 - 08:31] создать объект пагинатор куда передан какой сад и соответственно количество а количество объектов на страницу 4 вызвать метод patch


[08:31 - 08:48] при вызове этого метода будет осуществлен конкретный запрос будет произведен расчет в пагинации и соответственно получить объект а какие есть свойства и методы объекта пагинатор


Step 3 (S-44805) 8.png

[08:48 - 09:05] свойства после того как вы создали эти свойства account которые показывают полное число объектов на самом деле по 12 часа не сложная математическая процедура


[09:05 - 09:22] единственно что нужно знать и нужно знать полное количество объектов которые соответствуют данной выборки то есть данному queryset а вот это число объектов пагинатор автор считает и сложат переменную нам pages это полное число страниц


[09:22 - 09:37] ну собственно говоря производится деления числа объектов на количество объект на страницу + учитывается с последней странице может не полке а range собсна говоря список страниц


[09:37 - 09:56] основной метод это метод метод patch pro позволяет получить данный объект а потому что есть загрузить данную страницу а из объектов из нашей базы


[09:56 - 10:15] а при вызове метода непосредственно загружаются данные из базы данных какие есть свойства объекта page во 1 есть свойство list это список объектов на данной странице


Step 3 (S-44805) 9.png

[10:15 - 10:30] ну тех объектов которые нужно отображать нашем случае это список постов порядковый номер страниц но он совпадает с тем которые мы передали р а


Step 3 (S-44805) 10.png

[10:30 - 10:45] ну да то есть мы отображаем текущего если мы отображаем следующую там будет все больше и методов печь есть большое количество всяких вспомогательных методов которые нужны при отрисовке разных видов шаблонизатор например


[10:45 - 11:02] а есть следующая страница если предыдущая страница номер следующий номер предыдущей странице и тому подобное метод а итак


Step 3 (S-44805) 11.png

[11:02 - 11:22] помимо того что у нас есть общем то готовое решение для пагинации а фреймворке django есть еще несколько важных правил которые нужно помнить вообще при отображении любых листингов нужно проверять валидность


[11:22 - 11:39] параметров по сч и лимит если вы используете а простейший выборки то скорее всего даже неправильные параметры они вам не навредят потому что они будут с эскейп джанго models но вообще это хорошая правильная практика проверять


[11:39 - 11:58] пользовательские вот так проверять валидность параметров page элемент если вам вдруг были переданы какие то неправильные параметры например буквы вместо цифр либо отрицательные номер страницы следует отображать 4 404 ошибку


[11:58 - 12:15] в большинстве случаях неправильный параметр означает что такой страницы не существует то нужно показать шипку 404 a крайне желательно ограничивает максимальный максимальное количество


[12:15 - 12:31] объектов на страницу то есть проверяет что параметр лимит не больше такого то числа например 1000 обед дело в том что вот это количество объектов оно будет загружено на 1 будет выбрана из базы это будет скорее всего


[12:31 - 12:46] медленные запросы в чем больше лимит тем больше объектов загружается с диска тебя медленный запрос во 2 эти объекты будут загружены в память и они будут в цикле отрисованная шаблонизатор то есть


[12:46 - 13:04] это нагрузка на базу данных это большое потребление памяти вашему плетешь сервером это большой большой время ответ поэтому крайне желательно с точки зрения безопасности в ограничивать


[13:04 - 13:19] количество данных которое вы отдаете за раз и есть такая такая особенность отображение пустой странице последнее дело в том что когда о пользователе


[13:19 - 13:39] часто смотрим там 1 несколько штук и часто смотрят в последнюю страницу если список объектов активно меняется то с момента когда пользователь увидел пагинатор до момента когда пользователь счет на последнюю страницу количество объектов может уменьшиться например там посты


[13:39 - 13:55] ну с постами то не очень актуально скорее с короткоживущие объекты типа комментариев их удалил модератор их убрали сами пользователи а что ты еще изменилось и номер страницы которые раньше было в туалет последний


[13:55 - 14:11] он стал не актуальным то есть количество страниц уменьшилась в таких случаях а желательно помнить что человек хотел увидеть не просто стране с номером 999 он хотел меня увидеть последние и показать ему последнюю страницу пусть даже с другим номером


[14:11 - 14:27] вот реализацию реализацию этих правил мы можем посмотреть таком сниппете а здесь приведена функции функции пожинать собсна говоря рассчитываю параметры пагинация для


Step 3 (S-44805) 12.png

[14:27 - 14:42] произвольного то есть она не зависит как от какого то конкретного типа объектов там посты ли вы что то другое а я всегда есть 2 параметра объект request


[14:42 - 14:59] и queryset потому что эта функция интенсивно работает с параметрами ей нужно 1 что мы делаем это мы загружаем а загружает параметр лимит


[14:59 - 15:18] указываем значение по умолчанию потому что люди часто не передают а и мы делаем преобразования int преобразование winter такая примитивная валидация то есть если преобразования не прошло значит вам пытались передать что то неправильно


[15:18 - 15:33] а если произошла ошибка можно ругаться можно поставить просто значение по умолчанию не так плох если вы превысили какое то максимальное значение например 100


[15:33 - 15:51] если есть ли максимальные значения мы опять таки ставит значение по умолчанию 10 то есть это защита от большого объема данных итак это мы загрузили параметр лимит получили параметрами а параметр


[15:51 - 16:10] можно было в принципе загружается на логично а а ну вот мы уже здесь аналогичным образом розыгрыша только значение по умолчанию нас 1 также мы преобразуем with целое число а ну если у нас что то не получилось


[16:10 - 16:26] то есть при образовании не удалось а мы в данном случае возвращаем 404 то есть неправильный номер страницы а здесь на самом деле тоже можно более 34 значит ты неправильно неправильно лимите это такое


[16:26 - 16:44] дискуссионный вопрос далее мы создаем объект пагинатор с переданном коде светом и с указанным лимита а мы пытаемся произвести непосредственно загрузку данной


[16:44 - 17:02] страниц если а мы проскочили последнюю страницу пагинатор выбросе специально исключением t page то есть это как раз случай пустой последней странице в таком случае мы загружаем данные не по номеру страница


[17:02 - 17:19] а по переменной пагинатора нам pages то есть он всегда знает сколько на самом деле страниц на данный момент поэтому мы загружаем а страницу по данным пагинатора ну и в итоге мы возвращаем вот


[17:19 - 17:39] примерно через которое можно получить у список объектов и сам объект пагинатор а и того вот эта функция общем то такой полезный шутка на самом деле я думаю можно было бы перенести отказ в принципе он позволяет вам


[17:39 - 17:44] добавить пагинацию практически к любому листингу объектов