---
# System prepended metadata

title: Практика 12. Django
tags: [Python Advanced]

---

---
tags: Python Advanced
---

# Практика 12. Django

Домашня сторінка Django знаходиться за адресою https://www.djangoproject.com/, а домашня сторінка документації – за адресою https://docs.djangoproject.com/. Поки що ви можете обмежитися простим переглядом документації. Вона вам стане в нагоді, якщо ви захочете внести зміни до навчального проєкту або займетеся створенням власних web-застосунків.

## Базовий рівень

### Задача 1. *Нові проекти*

Щоб краще зрозуміти, що робить Django, побудуйте пару порожніх проєктів і подивіться, що станеться. Створіть новий каталог із простим ім'ям типу `snap_gram` або `insta_chat` (за межами каталогу `learning_log`), перейдіть до цього каталогу в термінал. Виконайте команду `django-admin startproject snap_gram .` (Зверніть увагу на точку в кінці команди). Перегляньте файли та каталоги, створені командою, та порівняйте їх з файлами та каталогами Learning Log. Зробіть це кілька разів, поки не почнете добре розуміти, що саме робить Django під час створення нового проекту, а потім видаліть каталоги проектів.

### Задача 2. *Короткі записи*

Метод `__str__()` у моделі `Entry` в даний час приєднує багатокрапку до кожного екземпляра `Entry`, що відображається Django на адміністративному сайті або в оболонці. Додайте в метод `__str__()` команду if, яка додає багатокрапку тільки для записів, довжина яких перевищує 50 символів. Скористайтеся адміністративним сайтом, щоб ввести запис довжиною менше 50 символів, і переконайтеся, що при його перегляді багатокрапка не відображається.

### Задача 3. *Піцерія*

Створіть новий проект з ім'ям `pizzeria`, що містить додаток `pizzas`. Визначте модель `Pizza` з полем `name`, де зберігаються назви видів піци (наприклад, «Гавайська» або «Чотири сири»). Визначте модель `Topping` із полями `pizza` та `name`. Поле `pizza` має містити зовнішній ключ до моделі `Pizza`, а поле `name` повинно дозволяти зберігати такі значення, як ананас або гриби. Зареєструйте обидві моделі на адміністративному сайті. Використовуйте сайт для введення назв піци та топінгів.

### Задача 4. *План харчування*

Напишіть програму для складання плану харчування на тиждень. Створіть новий каталог з ім'ям `meal_planner`, а в цьому каталозі новий проект Django. Створіть новий додаток з ім'ям `meal_plans`. Побудуйте просту домашню сторінку для цього проекту.

### Задача 5. *Домашня сторінка Pizzeria*

Додайте домашню сторінку до проекту *Pizzeria*, який ви почали будувати у задачі 3.

### Задача 6. *Сторінки Pizzeria*

Додайте сторінку до проекту *Pizzeria* з задачи 5 із назвами видів піци. Зв'яжіть кожну назву піци зі сторінкою, на якій відображається список добавок до цієї піци. Обов'язково застосуйте наслідування шаблонів, щоб підвищити ефективність побудови сторінок.

## Середній рівень

### Задача 7. *Блог*

Створіть новий проєкт Django на ім'я *Blog*. Створіть у проекті додаток (application) з ім'ям `blogs` та моделлю `BlogPost`. Модель має містити такі поля, як `title`, `text` та `date_added`. Створіть суперкористувача для проєкту та скористайтесь адміністративним сайтом для створення пари коротких повідомлень. Створіть домашню сторінку, на якій відображаються усі повідомлення в хронологічному порядку. Зробіть одну форму для створення нових повідомлень, а іншу форму для редагування існуючих повідомлень. Заповніть форми і переконайтеся, що вони працюють.

### Задача 8. *Облікові записи в блозі*

Додайте систему аутентифікації та реєстрації в проект *Blog*, робота над яким почалася в задачі 7. Простежте за тим, щоб користувач, який виконав вхід, бачив своє ім'я на екрані, а незареєстровані користувачі бачили посилання на сторінку реєстрації.

### Задача 9. *Рефакторинг Learning Log*

В `views.py` є два місця, в яких програма перевіряє, що користувач, пов'язаний з темою, є користувачем. Помістіть код цієї перевірки у функцію з ім'ям `check_topic_owner()` і за потреби викличте цю функцію.

### Задача 10. *Захист new_entry*

Користувач може спробувати додати новий запис до журналу іншого користувача, вводячи URL-адресу з ідентифікатором теми, що належить іншому користувачеві. Щоб запобігти подібним атакам, перед збереженням нового запису перевірте, що поточний користувач є власником теми, до якої належить запис.

### Задача 11. *Захищений блог*

У проекті *Blog* вживіть заходів для того, щоб кожне повідомлення в блозі було пов'язане з конкретним користувачем. Переконайтеся, що читання всіх повідомлень доступне всім користувачам, але тільки зареєстровані користувачі можуть створювати нові та редагувати існуючі повідомлення. У функції `view`, в якій користувачі редагують повідомлення, перед обробкою форми переконайтеся в тому, що повідомлення, що редагується, належить саме цьому користувачеві.

## Підвищений рівень

### Задача 12. *Інші форми*

Ми застосували стилі Bootstrap до сторінки `login`. Внесіть аналогічні зміни до інших сторінок на базі форм: `new_topic`, `new_entry`, `edit_entry` та `register`.

### Задача 13. *Стильове оформлення Blog*

Використовуйте Bootstrap для стильового оформлення проекту *Blog* із задачі 11.

### Задача 14. *Блог в інтернеті*

Розгорніть проект *Blog*, над яким ви працювали раніше, на сервері PythonAnywhere. Внесіть зміну до проєкту, щоб змінна `DEBUG` мала значення `False` та користувачі не бачили повну сторінку помилки Django у разі виникнення будь-яких проблем.

### Задача 15. *Розширення Learning Log*

Додайте просту функцію в *Learning Log* (наприклад, виведення розширеної інформації про проект на домашній сторінці) та надішліть зміни у розгорнуту копію на PythonAnywhere. Потім спробуйте внести складнішу зміну — наприклад, щоб користувач міг призначити тему загальнодоступною. Для цього в модель `Topic`
додається атрибут з ім'ям `public` (за умовчанням він повинен дорівнювати `False`), а на сторінці `new_topic` - елемент форми, що дозволяє перетворити особисту тему на загальнодоступну. Після цього проведіть міграцію проекту та переробіть файл `views.py`, щоб будь-яка загальнодоступна тема також була видимою і для користувачів, які не пройшли аутентифікації. Не забудьте провести міграцію бази даних після надсилання змін на PythonAnywhere.

:::success
Надішліть, будь ласка, посилання на проєкти, що виклали на PythonAnywhere
:::

---

(c) Яценко Р.М., 2023-2024

[Навчальний центр комп'ютерних технологій "Кіт"](http://kit.kh.ua/)

<img src="https://i.imgur.com/Kh901c1.png" style="width: 150px; position: fixed; top: 100px; right: 10px; border: 0; box-shadow: none;">
