Решение 1: Создание проекта
# Создаём директорию и переходим в неё
mkdir myproject
cd myproject
# Виртуальное окружение
python -m venv venv
venv\Scripts\activate # Windows
# Устанавливаем Django
pip install django
# Проверяем версию
python -m django --version # Должно быть 5.x
# Создаём структуру проекта
django-admin startproject config .
# Запускаем сервер
python manage.py runserver
Ожидаемый результат: в терминале появятся строки:
Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).
...
Django version 5.x, using settings 'config.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
По адресу http://127.0.0.1:8000/ откроется страница Django с сообщением «The install worked successfully! Congratulations!».
Решение 2: Первое приложение
# Создаём приложение
python manage.py startapp myapp
# config/settings.py — регистрируем приложение
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'myapp', # добавили
]
Важно: после добавления приложения в INSTALLED_APPS сервер должен перезапуститься автоматически. Убедитесь, что ошибок нет.
Решение 3: Первый маршрут и view
# myapp/views.py
from django.http import HttpResponse
def index(request):
return HttpResponse("Привет от Django!")
# myapp/urls.py — создаём новый файл
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
]
# config/urls.py — подключаем маршруты myapp
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('myapp.urls')), # добавили
]
Ожидаемый результат: http://127.0.0.1:8000/ показывает «Привет от Django!».
Решение 4: URL с параметром
# myapp/views.py — добавляем новую функцию
from django.http import HttpResponse
def index(request):
return HttpResponse("Привет от Django!")
def item_detail(request, item_id):
return HttpResponse(f"Товар #{item_id}")
# myapp/urls.py — добавляем маршрут
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
path('items/<int:item_id>/', views.item_detail, name='item-detail'),
]
Ожидаемый результат:
- http://127.0.0.1:8000/items/42/ → «Товар #42»
- http://127.0.0.1:8000/items/abc/ → 404 (не является целым числом)
Решение 5: Шаблон
<!-- myapp/templates/myapp/index.html -->
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<title>Главная</title>
</head>
<body>
<h1>{{ message }}</h1>
<p>Добро пожаловать в мой Django-проект!</p>
</body>
</html>
# myapp/views.py — обновляем view
from django.shortcuts import render
from django.http import HttpResponse
def index(request):
context = {
'message': 'Привет от Django!',
}
return render(request, 'myapp/index.html', context)
def item_detail(request, item_id):
return HttpResponse(f"Товар #{item_id}")
Структура файлов:
myapp/
├── templates/
│ └── myapp/
│ └── index.html ← шаблон здесь
├── views.py
└── urls.py
Ожидаемый результат: http://127.0.0.1:8000/ рендерит HTML-шаблон с текстом «Привет от Django!».
Почему двойная вложенность templates/myapp/? Django ищет шаблоны во всех установленных приложениях. Если два приложения имеют файл
templates/index.html, возникнет конфликт. Именно поэтому принята конвенция: templates/<app_name>/template.html.