Нам нужно создать 2 вида:

  • индексный - для вывода списка проектов на страницу;
  • детальный - для вывода полного описания конкретного проекта.

Для создания видов откройте файл my-portfolio\projects\views.py и добавьте в него следующее содержимое (2-12 строки):

from django.shortcuts import render
from projects.models import Project

def project_index(request):
    projects = Project.objects.all()
    context = {"projects": projects}
    return render(request, "project_index.html", context)

def project_detail(request, pk):
    project = Project.objects.get(pk=pk)
    context = {"project": project}
    return render(request, "project_detail.html", context)

В методе project_index() в переменную projects получаем все записи из БД и помещаем ее в переменную context. Данная переменная нужна обязательно, потому что с помощью нее данные передаются в шаблон страницы.

В методе project_detail() в переменную project помещаем запись с первичным ключом (primary key) из параметра метода.

Теперь нужно указать по каким URL из браузера будут срабатывать эти методы. Для этого в папке projects создадим файл urls.py. Откроем его и добавим следующее содержимое:

from django.urls import path
from . import views
urlpatterns = [
    path("", views.project_index, name="project_index"),
    path("<int:pk>/", views.project_detail, name="project_detail"),
]

Теперь в файле personal_portfolio/urls.py указать о существовании нового файла urls.py (с 1 по 6 строку).

from django.urls import path, include

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

Теперь индексную страницу портфолио можно будет открыть по адресу:

localhost:8000/projects

А детальную страницу (например, с первым проектом) по адресу:

localhost:8000/projects/1

Осталось добавить шаблоны, для вывода содержимого из БД в браузере.