Урок 5: Регистрация пользователей — Потому что комментировать должны только достойные!


Урок 5

Урок 5: Регистрация пользователей — Потому что комментировать должны только достойные!

Ну что, добрался до этого момента? 🧙‍♂️ Твой блог уже работает, посты выходят, а комментарии сыплются (надеемся, только хорошие). Но, погодите… мы что, действительно позволяем всем подряд оставлять комментарии? Нет, нет, нет! Немного эксклюзивности не помешает. Только самые достойные, зарегистрированные пользователи должны делиться своими мыслями (или спорить о том, стоит ли класть ананас на пиццу 🍕).

В этом уроке мы добавим регистрацию пользователей, чтобы посетители могли регистрироваться, входить в систему и оставлять комментарии. А пока убедимся, что комментировать смогут только зарегистрированные пользователи. Готов? Поехали!


Шаг 1: Активируем Виртуальное Окружение (Магия начинается)

Сначала убедись, что твоё виртуальное окружение активно. Это твоя магическая сфера, где всё работает как часы.

Если ты ещё не внутри, запусти:

source venv/bin/activate

Как только увидишь (venv) в начале строки терминала, можно приступать к новым магическим приключениям. 🧙‍♂️


Шаг 2: Обновляем forms.py — Убираем поле author и добавляем CustomUserCreationForm

Теперь мы обновим форму, убрав поле author из CommentForm, и добавим нашу кастомную форму для регистрации пользователей.

Путь к файлу: myblog/blog/forms.py

Вот как теперь должен выглядеть твой forms.py:

from django.contrib.auth.forms import UserCreationForm
from django import forms
from django.contrib.auth.models import User
from .models import Comment

class CommentForm(forms.ModelForm):
    class Meta:
        model = Comment
        fields = ['content']  # Оставляем только поле для текста комментария

class CustomUserCreationForm(UserCreationForm):
    email = forms.EmailField(required=True)

    class Meta:
        model = User
        fields = ['username', 'email', 'password1', 'password2']

Теперь:

  • Мы просим только содержимое комментария, а автором комментария будет назначен залогиненный пользователь.
  • У нас есть CustomUserCreationForm, которая добавляет поле для электронной почты при регистрации.

Шаг 3: Модифицируем View blog_post_detail, чтобы назначить автора комментарию

Поскольку мы больше не запрашиваем автора в форме, назначим автора комментарию на основе залогиненного пользователя в view.

Путь к файлу: myblog/blog/views.py

Вот как теперь выглядит view blog_post_detail:

from django.shortcuts import render, get_object_or_404, redirect
from .models import BlogPost, Comment
from .forms import CommentForm

def blog_post_detail(request, pk):
    post = get_object_or_404(BlogPost, pk=pk)
    comments = post.comments.all()

    if request.method == 'POST':
        if request.user.is_authenticated:
            form = CommentForm(request.POST)
            if form.is_valid():
                comment = form.save(commit=False)
                comment.blog_post = post
                comment.author = request.user.username  # Автоматически назначаем автором залогиненного пользователя
                comment.save()
                return redirect('blog_post_detail', pk=post.pk)
        else:
            return redirect('login')  # Перенаправляем на логин, если пользователь не залогинен
    else:
        form = CommentForm()

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

Шаг 4: Создаем View для регистрации пользователей

Теперь создадим view, которая будет обрабатывать регистрацию пользователей. Если форма заполнена правильно, пользователь автоматически залогинится и будет перенаправлен на главную страницу блога.

Путь к файлу: myblog/blog/views.py

Добавь этот код для создания view регистрации:

from django.contrib.auth import login

def register(request):
    if request.method == 'POST':
        form = CustomUserCreationForm(request.POST)
        if form.is_valid():
            user = form.save()
            login(request, user)  # Автоматически логиним пользователя после регистрации
            return redirect('blog_index')
    else:
        form = CustomUserCreationForm()

    return render(request, 'registration/register.html', {'form': form})

Шаг 5: Создаем шаблон для регистрации

Теперь нужно создать шаблон для страницы регистрации, чтобы пользователи могли ввести логин, электронную почту и пароль.

Путь к файлу:

myblog/
  blog/
    templates/
      registration/
        register.html

Вот содержимое для register.html:

{% extends "base.html" %}

{% block title %}Регистрация{% endblock %}

{% block content %}
<h2>Создать аккаунт</h2>
<form method="POST">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Зарегистрироваться</button>
</form>
{% endblock %}

Шаг 6: Добавляем маршрут для регистрации в urls.py

Теперь добавим маршрут для страницы регистрации в urls.py.

Путь к файлу: myblog/blog/urls.py

Добавь этот маршрут в urls.py:

from . import views

urlpatterns = [
    path('', views.blog_index, name='blog_index'),
    path('post/<int:pk>/', views.blog_post_detail, name='blog_post_detail'),
    path('register/', views.register, name='register'),  # Страница регистрации
]

Теперь страница регистрации доступна по адресу /register/.


Шаг 7: Обновляем blog_post_detail.html, чтобы блокировать комментарии для незалогиненных пользователей

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

Путь к файлу:

myblog/
  blog/
    templates/
      blog_post_detail.html

Вот как теперь выглядит секция комментариев в blog_post_detail.html:

<h3>Комментарии</h3>
<ul>
    {% for comment in comments %}
        <li><strong>{{ comment.author }}</strong>: {{ comment.content }}</li>
    {% empty %}
        <li>Комментариев пока нет. Будь первым, кто поделится мнением!</li>
    {% endfor %}
</ul>

{% if user.is_authenticated %}
    <h3>Оставить комментарий</h3>
    <form method="POST">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit">Отправить</button>
    </form>
{% else %}
    <p><a href="{% url 'login' %}">Войдите</a> или <a href="{% url 'register' %}">зарегистрируйтесь</a>, чтобы оставить комментарий!</p>
{% endif %}

Теперь комментарии могут оставлять только залогиненные пользователи.


Шаг 8: Тестируем процесс регистрации и комментариев

Когда все изменения сделаны, запусти сервер и протестируй регистрацию и комментарии, запустив:

python3 manage.py runserver

Посети http://127.0.0.1:8000/register/, чтобы зарегистрироваться, а затем попробуй оставить комментарий как залогиненный пользователь.


Шаг 9: Деактивируем Виртуальное Окружение (Даже магам нужен отдых)

Когда закончишь, не забудь деактивировать виртуальное окружение:

deactivate

И вот ты снова в реальном мире (без магии, но с рабочим кодом).


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

Бум! 🎉 Ты успешно добавил регистрацию пользователей в свой блог и сделал так, чтобы только зарегистрированные могли оставлять комментарии. Больше никаких анонимных троллей в комментариях! Ты также очистил форму комментариев и сделал регистрацию плавной, как по маслу.

В следующем уроке мы займемся профилями пользователей — ведь каждый заслуживает немного индивидуальности на твоём блоге. А пока наслаждайся наблюдением за ростом базы зарегистрированных пользователей! 🎩✨


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