Урок 3: Форми – Як Просити Ввічливо Дані Від Користувачів (І Не Відлякати Їх)


Lesson 3

Урок 3: Форми – Як Просити Ввічливо Дані Від Користувачів (І Не Відлякати Їх)

Привіт знову, відважний чарівник! 🧙‍♂️ До цього моменту ти вже створив моделі, налаштував URL і вивів пости на свій блог, як справжній профі. Але що робити, коли відвідувачі твого сайту не можуть залишати коментарі або ділилися думками щодо того, який шрифт краще? Тут приходить на допомогу наш сьогоднішній магічний трюк – форми!

Форми – це твої двері до взаємодії з користувачами. Це як гарячий чай і пиріжки – люди залишають свої дані, і ти з задоволенням їх приймаєш (окрім, звичайно, спаму, ми про це подбаємо). У цьому уроці ми створимо форму для коментарів для твого блогу. Готуйся, буде весело!


Крок 1: Активуй Віртуальне Середовище (Твоя Захисна Бульбашка)

Перш ніж щось робити, переконайся, що ти знаходишся в віртуальному середовищі. Це твоя магічна бульбашка, де всі залежності живуть у мирі та гармонії.

Якщо твоє віртуальне середовище ще не активоване, введи наступну команду:

source venv/bin/activate

Якщо ти працюєш на Arch Linux, переконайся, що в тебе встановлено віртуальне середовище за допомогою цієї команди:

sudo pacman -S python-virtualenv

Як тільки ти активував середовище, на початку кожного рядка терміналу буде відображатися (venv). Це як твій маленький Хогвартс – тільки з Python і без сов.


Крок 2: Створюємо Модель BlogPost (Наше Заклинання)

Перш ніж перейти до коментарів, пам’ятай, що ми збираємося додавати коментарі до блогових постів. Тому нам потрібно спочатку створити модель BlogPost для основи нашого блогу. Впевнись, що у файлі models.py ти маєш наступний код:

from django.db import models

class BlogPost(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    
    def __str__(self):
        return self.title

Крок 3: Створюємо Модель Comment (Бо Даним Потрібен Дім)

Тепер, коли ми маємо модель BlogPost, нам потрібна модель для зберігання коментарів, бо кожному посту потрібен зворотній зв’язок (або кілька “Перший!”). Додай модель Comment у файлі models.py, одразу під моделлю BlogPost:

class Comment(models.Model):
    blog_post = models.ForeignKey(BlogPost, on_delete=models.CASCADE, related_name='comments')
    author = models.CharField(max_length=100)
    content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f'Comment by {self.author} on {self.blog_post}'

Крок 4: Створюємо та Застосовуємо Міграції (Бо Навіть Бази Даних Потребують Любові)

Так само, як і з блог-постами, ми повинні повідомити базі даних про нашу нову модель Comment. Виконай наступні команди:

python3 manage.py makemigrations
python3 manage.py migrate

Бум! Таблиця Comment тепер існує і готова зберігати всі відгуки (або саркастичні коментарі) твоїх відвідувачів.


Крок 5: Створюємо CommentForm (Просимо Дані Ввічливо)

Тепер нам потрібно створити форму, щоб користувачі могли залишати свої коментарі. Django робить форми дуже простими – майже занадто простими, як для магії.

Створи новий файл у директорії blog під назвою forms.py і додай наступний код:

from django import forms
from .models import Comment

class CommentForm(forms.ModelForm):
    class Meta:
        model = Comment
        fields = ['author', 'content']

Форма ModelForm у Django – це як магічне заклинання, яке автоматично створює форму на основі твоєї моделі. Майже як шахрайство, але легальне. 😉


Крок 6: Додаємо Форму до Представлення (Де Відбувається Магія)

Тепер, коли у нас є форма, нам потрібно відобразити її та обробляти введені дані користувачів при їх відправленні. Давай змінимо наше представлення blog_index у файлі views.py, щоб додати цю функцію.

Також переконайся, що ти імпортував функцію get_object_or_404 з модуля shortcuts Django, щоб уникнути помилок під час отримання індивідуальних блогових постів.

Ось виправлений файл views.py:

from django.shortcuts import render, get_object_or_404, redirect  # Не забудь імпортувати get_object_or_404
from .models import BlogPost, Comment
from .forms import CommentForm

def blog_index(request):
    posts = BlogPost.objects.all().order_by('-created_at')
    return render(request, 'blog_index.html', {'posts': posts})

def blog_post_detail(request, pk):
    post = get_object_or_404(BlogPost, pk=pk)  # Використовуємо get_object_or_404
    comments = post.comments.all()

    if request.method == 'POST':
        form = CommentForm(request.POST)
        if form.is_valid():
            comment = form.save(commit=False)
            comment.blog_post = post
            comment.save()
            return redirect('blog_post_detail', pk=post.pk)
    else:
        form = CommentForm()

    return render(request, 'blog_post_detail.html', {'post': post, 'comments': comments, 'form': form})

Крок 7: Створюємо Шаблон для Відображення Форми (Дозвольмо Користувачам Говорити!)

Тепер давай змінимо шаблон, щоб користувачі могли бачити форму і залишати коментарі до твоїх постів. Відкрий або створи файл blog_post_detail.html у директорії templates і додай наступне:

<!DOCTYPE html>
<html>
<head>
    <title>{{ post.title }}</title>
</head>
<body>
    <h1>{{ post.title }}</h1>
    <p>{{ post.content }}</p>

    <h2>Коментарі</h2>
    <ul>
        {% for comment in comments %}
        <li><strong>{{ comment.author }}</strong>: {{ comment.content }}</li>
        {% endfor %}
    </ul>

    <h3>Залишити коментар</h3>
    <form method="POST">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit">Відправити</button>
    </form>
</body>
</html>

Крок 8: Додаємо URL для Детального Перегляду Посту

І нарешті, давай налаштуємо URL, щоб користувачі могли переглядати кожен пост в деталях. Відкрий файл urls.py у своїй директорії blog і додай наступний код:

from . import views

urlpatterns = [
    path('', views.blog_index, name='blog_index'),
    path('post/<int:pk>/', views.blog_post_detail, name='blog_post_detail'),
]

Цей маршрут буде відображати URL на кшталт /post/1/ до блогового посту з відповідним ідентифікатором (у нашому випадку, це пост №1). Твої відвідувачі тепер можуть бачити повний пост і його коментарі.

Ти можеш протестувати це за допомогою посилання http://127.0.0.1:8000/blog/post/1/ після створення першого блогового посту.


Крок 9: Деактивація Віртуального Середовища

Коли ти завершиш роботу на сьогодні (або захочеш перекусити), не забудь деактивувати своє віртуальне середовище, щоб вийти з магічної бульбашки кодування.

Просто введи:

deactivate

Тепер на початку рядка терміналу більше не буде позначки (venv), а це означає, що ти повернувся до звичайного середовища своєї системи.


Висновок Уроку 3

Вітаю, відважний чарівник! 🎉 Ти успішно інтегрував форми у свій блог на Django. Тепер твої відвідувачі можуть залишати коментарі до твоїх постів – чи це будуть цінні поради, чи просто “Круто!” або навіть “Ти зробив помилку у слові” (таке буває, ніхто не застрахований).

На наступному уроці ми заглибимося у автентифікацію користувачів – бо не всім варто дозволяти залишати коментарі безконтрольно, правда ж? А поки що насолоджуйся своїм новим інтерактивним блогом і, можливо, перевіряй ті коментарі (перед тим, як прийдуть тролі).


See also