Урок 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 блог. Теперь твои посетители могут оставлять комментарии к постам — будут ли это полезные советы или просто “классный пост!”, а может кто-то поправит твои ошибки (ну, бывает).
На следующем уроке займемся авторизацией пользователей — ведь не всем подряд можно давать право на комментарии, верно? А пока наслаждайся новым интерактивным блогом и держи комменты под контролем (до прихода троллей).
Смотрите также
- Урок 6: Профили Пользователей – Потому что Каждому Нужна Своя Минутка Славы
- Урок 5: Регистрация пользователей — Потому что комментировать должны только достойные!
- Урок 4: Аутентификация пользователей – Ведь не все должны иметь доступ к вашему блогу!
- Урок 2: Шаблон Model-View-Template (MVT) – Как MVC, но с магией и без головной боли
- Django: Веб-фреймворк, который превратит тебя в мага кода (Без волшебной палочки и заклинаний)