Урок 3: Формы – Искусство Просить Данные У Пользователей (И Не Отпугнуть Их)


Lesson 3

Урок 3: Формы – Искусство Просить Данные У Пользователей (И Не Отпугнуть Их)

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

Формы — это мост к общению с пользователями. Они, как ворота, открывают путь к комментариям, отзывам и, конечно, спаму (но с этим мы справимся!). Сегодня мы создадим форму для комментариев. Готовься, будет весело и почти как чаепитие с пряниками.


Шаг 1: Активируй Виртуальную Среду (Твой Защитный Шар)

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

Если виртуальная среда не активирована, введи следующую команду:

source venv/bin/activate

Если ты на Arch Linux, убедись, что установил виртуальное окружение:

sudo pacman -S python-virtualenv

Как только увидишь (venv) в начале строки терминала, знай: ты уже в своем защищенном мире. Как матрешка внутри матрешки, никто снаружи тебя не тронет.


Шаг 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 — это как автоматическая наклейка на холодильник, которая сама клеится на место. Почти как магия, но абсолютно легальная.


Шаг 6: Добавляем Форму в Представление (Тут Вся Магия)

Теперь, когда у нас есть форма, нужно отобразить её и обработать данные, которые введут пользователи. Давай изменим наше представление blog_index в файле views.py, чтобы добавить форму комментариев.

Не забудь импортировать функцию get_object_or_404 из модуля shortcuts, чтобы не было ошибок при получении постов.

Вот исправленный код 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'),
]

Теперь, после того как создал первый блог-пост, можешь протестировать это по ссылке http://127.0.0.1:8000/blog/post/1/.


Шаг 9: Деактивируем Виртуальную Среду

Когда закончил на сегодня (или просто пора идти пить чай), не забудь деактивировать своё виртуальное окружение, чтобы выйти из этого магического мира.

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

deactivate

Теперь, когда (venv) пропал с начала строки терминала, ты вернулся в реальный мир… ну, почти.


Заключение Урока 3

Поздравляю, великий маг! 🎉 Ты успешно добавил формы в свой Django блог. Теперь твои посетители могут оставлять комментарии к постам — будут ли это полезные советы или просто “классный пост!”, а может кто-то поправит твои ошибки (ну, бывает).

На следующем уроке займемся авторизацией пользователей — ведь не всем подряд можно давать право на комментарии, верно? А пока наслаждайся новым интерактивным блогом и держи комменты под контролем (до прихода троллей).


Смотрите также