💻 Примеры: Введение в Django

⚡ Минимальный рабочий пример

# 1. pip install django
# 2. django-admin startproject config .
# 3. python manage.py startapp myapp

# myapp/views.py
from django.http import HttpResponse
def hello(request):
    return HttpResponse("Hello, Django!")

# myapp/urls.py
from django.urls import path
from . import views
urlpatterns = [path('hello/', views.hello, name='hello')]

# config/urls.py — добавить:
# path('', include('myapp.urls'))

# settings.py — добавить в INSTALLED_APPS:
# 'myapp'

# 4. python manage.py runserver → http://127.0.0.1:8000/hello/

Пример 1: Создание проекта с нуля

Полная последовательность создания нового Django 5.x проекта:

# Шаг 1: создаём папку и виртуальное окружение
mkdir myproject
cd myproject
python -m venv venv
venv\Scripts\activate   # Windows

# Шаг 2: устанавливаем Django
pip install django
python -m django --version  # убеждаемся: Django 5.x

# Шаг 3: создаём структуру проекта
django-admin startproject config .

# Шаг 4: проверяем что всё работает
python manage.py runserver

После шага 4 перейдите на http://127.0.0.1:8000/ — увидите страницу Django с ракетой.

Пример 2: Создание и подключение приложения

# Шаг 1: создаём приложение
python manage.py startapp myapp

# Структура после команды:
# myapp/
# ├── __init__.py
# ├── admin.py
# ├── apps.py
# ├── migrations/
# │   └── __init__.py
# ├── models.py
# ├── tests.py
# └── views.py
# Шаг 2: регистрируем в config/settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'myapp',  # добавляем наше приложение
]

Пример 3: Простое view и маршрут

# myapp/views.py
from django.http import HttpResponse

def index(request):
    return HttpResponse("<h1>Главная страница</h1>")

def hello(request):
    name = request.GET.get('name', 'мир')
    return HttpResponse(f"<h1>Привет, {name}!</h1>")
# myapp/urls.py — создаём новый файл
from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),
    path('hello/', views.hello, name='hello'),
]
# config/urls.py — подключаем маршруты приложения
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('myapp.urls')),  # подключаем myapp
]

Теперь:

  • http://127.0.0.1:8000/ — главная страница
  • http://127.0.0.1:8000/hello/ — приветствие
  • http://127.0.0.1:8000/hello/?name=Django — приветствие с именем

Пример 4: View с шаблоном

# myapp/views.py
from django.shortcuts import render

def about(request):
    context = {
        'title': 'О проекте',
        'description': 'Мой первый Django-проект',
        'features': ['ORM', 'Admin', 'Templates'],
    }
    return render(request, 'myapp/about.html', context)
<!-- myapp/templates/myapp/about.html -->
<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <title>{{ title }}</title>
</head>
<body>
    <h1>{{ title }}</h1>
    <p>{{ description }}</p>
    <ul>
    {% for feature in features %}
        <li>{{ feature }}</li>
    {% endfor %}
    </ul>
</body>
</html>
Шаблон ищется автоматически в myapp/templates/myapp/about.html, если в settings.py установлено 'APP_DIRS': True. Двойная вложенность templates/myapp/ — рекомендуемое соглашение Django, предотвращающее конфликты имён между приложениями.

Пример 5: Class-based view (CBV)

# myapp/views.py
from django.views import View
from django.http import HttpResponse

class HelloView(View):
    def get(self, request):
        return HttpResponse("Hello from CBV!")

    def post(self, request):
        return HttpResponse("POST request received")
# myapp/urls.py
from django.urls import path
from .views import HelloView

urlpatterns = [
    path('hello-cbv/', HelloView.as_view(), name='hello-cbv'),
]
Class-based views (CBV) удобны для повторного использования логики и соответствуют принципу DRY. Метод as_view() создаёт callable для системы маршрутизации.

Пример 6: URL с параметрами (path-конвертеры)

# myapp/urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('items/', views.item_list, name='item-list'),
    path('items/<int:item_id>/', views.item_detail, name='item-detail'),
    path('users/<str:username>/', views.user_profile, name='user-profile'),
    path('docs/<path:doc_path>/', views.serve_doc, name='serve-doc'),
]
# myapp/views.py
from django.http import HttpResponse

def item_list(request):
    return HttpResponse("Список товаров")

def item_detail(request, item_id):
    return HttpResponse(f"Товар #{item_id}")

def user_profile(request, username):
    return HttpResponse(f"Профиль пользователя: {username}")

def serve_doc(request, doc_path):
    return HttpResponse(f"Документ: {doc_path}")
Встроенные path-конвертеры: int (целые числа), str (строки без /), slug (слагифицированные строки), uuid (UUID), path (строки с /).