⚖️ Старый vs Новый: Django

⚡ Главные изменения

  • url() с regex → path() — Django 2.0+, читаемее и безопаснее
  • re_path() — аналог старого url() с regex, но явно обозначен
  • settings: TIME_ZONE/USE_I18N — без изменений, но LANGUAGE_CODE по умолчанию en-us

1. Маршрутизация: url() → path()

Это главное изменение, которое стоит знать при чтении старого кода Django 1.x.

Из лекции (старое — Django 1.x) Современное (Django 2.x+, 5.x)
from django.conf.urls import url from django.urls import path, re_path
Regex-паттерны обязательны Простые строки по умолчанию
url(r'^$', views.index) path('', views.index)
url(r'^items/(?P<pk>\d+)/$', views.detail) path('items/<int:pk>/', views.detail)

Старый стиль (из лекции — Django 1.x)

# config/urls.py — УСТАРЕВШИЙ СТИЛЬ
from django.conf.urls import url
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^$', views.index),
    url(r'^items/(?P<pk>\d+)/$', views.item_detail),
    url(r'^users/(?P<username>[\w-]+)/$', views.user_profile),
]

Современный стиль (Django 2.0+ / Django 5.x)

# config/urls.py — СОВРЕМЕННЫЙ СТИЛЬ
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', views.index),
    path('items/<int:pk>/', views.item_detail),
    path('users/<str:username>/', views.user_profile),
    path('', include('myapp.urls')),
]
Когда нужен regex? Используйте re_path() вместо старого url():
from django.urls import re_path

urlpatterns = [
    re_path(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
]
re_path() — это явная замена url() с тем же regex-синтаксисом, но из современного импорта.

2. Импорты: что изменилось

Старое (Django 1.x)Современное (Django 2.x+)
from django.conf.urls import url from django.urls import path, re_path
from django.conf.urls import include from django.urls import include
from django.conf.urls import patterns Удалено — используйте обычный список urlpatterns

3. Конвертеры путей vs regex

Встроенные конвертеры path() заменяют большинство regex-паттернов:

Старый regexСовременный конвертерОписание
(?P<pk>\d+) <int:pk> Целые числа
(?P<name>[^/]+) <str:name> Строки без /
(?P<slug>[-\w]+) <slug:slug> Slug-строки
(?P<pk>[0-9a-f-]{36}) <uuid:pk> UUID
(?P<path>.+) <path:path> Строки со /

4. settings.py — что изменилось в Django 4.x/5.x

НастройкаDjango 3.x и ранееDjango 4.x/5.x
DEFAULT_AUTO_FIELD Не было — использовался AutoField По умолчанию BigAutoField (64-bit)
CSRF cookies Стандартные настройки Добавлен CSRF_COOKIE_SAMESITE
Настройка DEFAULT_AUTO_FIELD в Django 3.2+ рекомендуется явно указывать в settings.py, чтобы избежать предупреждений о миграциях:
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'

5. Итоговая таблица: что из лекции устарело

Что в лекцииСовременный аналогВерсия
from django.conf.urls import url from django.urls import path, re_path Django 2.0
url() с regex для простых маршрутов path() со встроенными конвертерами Django 2.0
patterns() для urlpatterns Обычный список urlpatterns = [...] Django 1.10