--- 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;">