Целью домашнего задания является:
- создание основных view сайта (отображающих “рыбу”);
- настройка маршрутизации URL;
- использование шаблонизатора для генерации HTML;
- постраничное отображение (пагинация).
Создаем корневую директорию проекта и папки для статики (стилей, javascript, картинок и файлов пользователя в /uploads/)
mkdir -p ~/projects/ask_pupkin
cd ~/projects/ask_pupkin
mkdir -p {static,uploads,templates}
mkdir -p static/{css,js,img}
Далее рекомендуется создать в каталоге git репозиторий - шпаргалка. Обязательно создайте корректный файл .gitignore в котором нужно будет исключить venv, *.pyc и прочие временные и не относящиеся к проекту папки и файлы, например .idea/.
Разворачиваем в директории проекта python virtualenv ставим django. С помощью утилиты django-admin (появляется после установки django) нужно создать следующую структуру:
ask_pupkin - директория проекта
|--- app - директория приложения (создается командой manage.py startapp)
|--- ask_pupkin - библиотеки проекта (будут созданы django-admin.py)
|--- manage.py - скрипт управления (будет создан django-admin.py)
|--- templates - шаблоны
|--- static - статические файлы (JS, CSS, картинки)
└--- uploads - файлы загруженные юзером
При этом директории templates, static, uploads — придется создать самостоятельно.
Разработать view для отображения следующих страниц:
- cписок новых вопросов (главная страница) (URL = /)
- cписок “лучших” вопросов (URL = /hot/)
- cписок вопросов по тэгу (URL = /tag/blablabla/)
- cтраница одного вопроса со списком ответов (URL = /question/35/)
- форма логина (URL = /login/)
- форма регистрации (URL = /signup/)
- форма создания вопроса (URL = /ask/)
На данном этапе view не обязаны выбирать данные из базы, их задача - подготовить данные-заглушки (“рыбу”) и передать на отрисовку в соответствующий шаблон. Например таким образом:
questions = []
for i in range(1,30):
questions.append({
‘title’: ‘title ‘ + str(i),
‘id’: i,
‘text’: ‘text’ + str(i)
})
Далее список questions можно будет легко заменить на выборку из базы данных. Views отображающие формы (например форму логина) - могут просто вызывать шаблон.
Для всех вышеперечисленных view нужно прописать маршруты в app/urls.py и подключить их в корневом ask_pupkin/urls.py. Все маршруты должны быть именованными.
Для каждой из вышеперечисленных view нужно создать отдельный шаблон, отрисовывающий HTML данной страницы. В шаблонах не должно быть дублирования HTML - для этого следует использовать наследование шаблонов и подшаблоны (include). В шаблонах должны быть прописаны гиперссылки для переходов на другие страницы. URL не хардкодить, вместо этого использовать тэг url.
Общим функционалом для этих страниц является пагинация. Поэтому функционал пагинации следует вынести в отдельную функцию, которая будет принимать список объектов (или query-set), объект запроса (request) и будет возвращать нужную страницу и данные для шаблона пагинатора. Некорректные параметры пагинации нужно заменять на значения по-умолчанию и необходимо обработать исключения PageNotAnInteger и EmptyPage. Cигнатура функции должна быть следующей:
def paginate(objects_list, request, per_page=10):
# do smth with Paginator, etc…
return page
Создать views и шаблоны для основных страниц - 6:
- главная (список новых вопросов) - 1;
- страница вопроса (список ответов) - 1;
- страница добавления вопроса - 1;
- форма регистрации - 1;
- форма входа - 1;
- форма редактирования профиля - 1.
Создать urls.py для всех страниц - 4:
- Собственно urls.py - 2;
- Именованные маршруты (во всех шаблонах) - 2.
Постраничное отображение - 4:
- функция пагинации - 1;
- шаблон для отрисовки пагинатора - 2;
- корректная обработка “неправильных” параметров - 1.
- Туториал по Django Views;
- Документация по шаблонам;
- Наследование шаблонов;
- Постраничный вывод (пагинация).