Skip to content

Latest commit

 

History

History
102 lines (81 loc) · 7.18 KB

task-2.md

File metadata and controls

102 lines (81 loc) · 7.18 KB

Домашнее задание 2

Обработка HTTP запросов

Целью домашнего задания является:

  • создание основных view сайта (отображающих “рыбу”);
  • настройка маршрутизации URL;
  • использование шаблонизатора для генерации HTML;
  • постраничное отображение (пагинация).

1. Создание директории проекта ask_pupkin

Создаем корневую директорию проекта и папки для статики (стилей, 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/.

2. Создание django проекта и приложения

Разворачиваем в директории проекта 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 — придется создать самостоятельно.

3. Отображение данных

Разработать 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 отображающие формы (например форму логина) - могут просто вызывать шаблон.

4. Маршрутизация URL

Для всех вышеперечисленных view нужно прописать маршруты в app/urls.py и подключить их в корневом ask_pupkin/urls.py. Все маршруты должны быть именованными.

5. Шаблонизация

Для каждой из вышеперечисленных view нужно создать отдельный шаблон, отрисовывающий HTML данной страницы. В шаблонах не должно быть дублирования HTML - для этого следует использовать наследование шаблонов и подшаблоны (include). В шаблонах должны быть прописаны гиперссылки для переходов на другие страницы. URL не хардкодить, вместо этого использовать тэг url.

6. Функция пагинации

Общим функционалом для этих страниц является пагинация. Поэтому функционал пагинации следует вынести в отдельную функцию, которая будет принимать список объектов (или query-set), объект запроса (request) и будет возвращать нужную страницу и данные для шаблона пагинатора. Некорректные параметры пагинации нужно заменять на значения по-умолчанию и необходимо обработать исключения PageNotAnInteger и EmptyPage. Cигнатура функции должна быть следующей:

def paginate(objects_list, request, per_page=10):
    # do smth with Paginator, etc…
    return page

7. Баллы

Максимальные баллы за ДЗ - 14 баллов

Создать views и шаблоны для основных страниц - 6:

  • главная (список новых вопросов) - 1;
  • страница вопроса (список ответов) - 1;
  • страница добавления вопроса - 1;
  • форма регистрации - 1;
  • форма входа - 1;
  • форма редактирования профиля - 1.

Создать urls.py для всех страниц - 4:

  • Собственно urls.py - 2;
  • Именованные маршруты (во всех шаблонах) - 2.

Постраничное отображение - 4:

  • функция пагинации - 1;
  • шаблон для отрисовки пагинатора - 2;
  • корректная обработка “неправильных” параметров - 1.

8. Полезные ссылки