Нам нужно добавить 3 вида в файл views.py (папка приложения blog):

  • blog_index - индексная страница со всеми записями блога;
  • blog_detail - детальная страница, с полным описанием записи блога;
  • blog_category - страница с записями блога выбранной категории. 

Для этого в файл views.py добавьте следующий код (начиная со 2 строки):

from django.shortcuts import render

from blog.forms import CommentForm
from blog.models import Post, Comment

def blog_index(request):
    posts = Post.objects.all().order_by("-created_on")
    context = {"posts": posts}
    return render(request, "blog_index.html", context)

def blog_category(request, category):
    posts = Post.objects.filter(categories__name__contains=category).order_by(
        "-created_on"
    )
    context = {"category": category, "posts": posts}
    return render(request, "blog_category.html", context)

def blog_detail(request, pk):
    post = Post.objects.get(pk=pk)
    comments = Comment.objects.filter(post=post)
    
    form = CommentForm()
    if request.method == "POST":
        form = CommentForm(request.POST)
        if form.is_valid():
            comment = Comment(
                author=form.cleaned_data["author"],
                body=form.cleaned_data["body"],
                post=post,
            )

            comment.save()

    context = {"post": post, "comments": comments, "form": form}
    return render(request, "blog_detail.html", context)

В 3 строчке нужно импортировать класс формы для добавления нового комментария. Этот класс мы создадим позже.

В 7 строчке в переменную posts мы получаем все посты, начиная с последних.

В строчке 22 мы создаем новую пустую форму и передаем ее в шаблон.

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

Теперь создадим файл с классом формы blog/forms.py. Добавим в него следующее содержимое:

from django import forms

class CommentForm(forms.Form):
    author = forms.CharField(
        max_length=60,
        widget=forms.TextInput(attrs={
            "class": "form-control",
            "placeholder": "Укажите ваше имя"
        })
    )
    body = forms.CharField(widget=forms.Textarea(
        attrs={
            "class": "form-control",
            "placeholder": "Оставьте свой комментарий!"
        })
    )  

Осталось указать URL для всех страниц. Они должны быть следующего вида:

localhost:8000/blog - для страницы со всеми записями блога

localhost:8000/blog/1 - для страницы с отдельной записью блога

localhost:8000/blog/python - для страницы с записями блога выбранной категории.

Создадим файл urls.py в папке приложения blog. И добавим в него следующее содержимое:

from django.urls import path
from . import views

urlpatterns = [
    path("", views.blog_index, name="blog_index"),
    path("<int:pk>/", views.blog_detail, name="blog_detail"),
    path("<category>/", views.blog_category, name="blog_category"),
]

Теперь добавим строчку в файл urls.py (папка my-portfolio\personal_portfolio) (строка 4).

urlpatterns = [
    path("admin/", admin.site.urls),
    path("projects/", include("projects.urls")),
    path("blog/", include("blog.urls")),
]