diff --git a/99 System/Export/Подготовка к экзамену по веб-разработке.html b/99 System/Export/Подготовка к экзамену по веб-разработке.html index c953e05..74d6673 100644 --- a/99 System/Export/Подготовка к экзамену по веб-разработке.html +++ b/99 System/Export/Подготовка к экзамену по веб-разработке.html @@ -87,7 +87,7 @@ pre { margin: 10px 0 14px; padding: 12px 14px; - overflow-x: auto; + overflow-x: hidden; border: 1px solid #d8dee9; border-radius: 8px; background: #111827; @@ -95,6 +95,8 @@ font-family: "JetBrains Mono", Consolas, monospace; font-size: 13px; line-height: 1.45; + white-space: pre-wrap; + overflow-wrap: anywhere; } .hero { @@ -977,6 +979,87 @@ box-sizing: border-box; annotate()QuerySet с вычисляемым полем у каждого объекта

select_related делает SQL JOIN для ForeignKey/OneToOne. prefetch_related делает отдельный запрос для ManyToMany и обратных связей.

+

Основные термины Django models

+
+
ModelКласс Python, который наследуется от models.Model и описывает таблицу БД.
+
FieldПоле модели. Определяет колонку таблицы и правила работы со значением.
+
Primary keyПервичный ключ. Уникально идентифицирует строку таблицы.
+
MigrationФайл изменения схемы БД. Создаётся из изменений моделей.
+
makemigrationsСоздаёт файлы миграций.
+
migrateПрименяет миграции к базе данных.
+
Class MetaВнутренний класс настроек модели: сортировка, имена, ограничения.
+
ManagerОбъект доступа к запросам, обычно objects.
+
+

Поля модели

+ + + + + + + + + + + + + + + +
ПолеСмысл
CharFieldКороткая строка. Требует max_length.
TextFieldДлинный текст без обязательного лимита длины.
IntegerFieldЦелое число.
DecimalFieldТочное десятичное число, удобно для денег. Нужны max_digits, decimal_places.
BooleanFieldTrue или False.
DateFieldДата без времени.
DateTimeFieldДата и время.
EmailFieldСтрока с email-валидацией на уровне формы/модели.
FileFieldПуть к загруженному файлу.
ImageFieldФайл изображения, требует поддержку обработки изображений.
ForeignKeyСвязь многие-к-одному.
OneToOneFieldСвязь один-к-одному.
ManyToManyFieldСвязь многие-ко-многим.
+

Атрибуты полей

+
+
max_lengthМаксимальная длина строки. Обязателен для CharField.
+
null=TrueРазрешает хранить NULL в базе данных.
+
blank=TrueРазрешает пустое значение в форме и админке.
+
defaultЗначение по умолчанию.
+
primary_key=TrueДелает поле первичным ключом.
+
unique=TrueЗначение должно быть уникальным.
+
verbose_nameЧеловекочитаемое имя поля.
+
related_nameИмя обратной связи для связанных объектов.
+
+

Связи

+
class Author(models.Model):
+    name = models.CharField(max_length=100)
+
+class Book(models.Model):
+    title = models.CharField(max_length=200)
+    author = models.ForeignKey(Author, on_delete=models.PROTECT, related_name="books")
+

Прямая связь: book.author. Обратная связь через related_name: author.books.all().

+ + + + + + + +
on_deleteЧто делает
CASCADEУдаляет зависимые объекты вместе с главным.
PROTECTЗапрещает удалить объект, если на него есть ссылки.
SET_NULLЗаписывает NULL, требует null=True.
SET_DEFAULTЗаписывает значение по умолчанию.
DO_NOTHINGDjango ничего не делает, ответственность остаётся на БД/коде.
+

QuerySet и ленивость

+

QuerySet можно строить цепочкой, и Django не обязательно сразу идёт в БД. Запрос выполняется, когда данные реально нужны: цикл, индексация, вывод, list(), count(), exists().

+
qs = Product.objects.filter(is_active=True).order_by("-price")
+# БД ещё может не быть затронута
+for product in qs:
+    print(product.name)
+

Lookups

+ + + + + + + + + + + +
LookupСмысл
exactТочное совпадение.
iexactТочное совпадение без учёта регистра.
containsСодержит подстроку с учётом регистра.
icontainsСодержит подстроку без учёта регистра.
gt, gteБольше, больше или равно.
lt, lteМеньше, меньше или равно.
inЗначение входит в список.
rangeЗначение в диапазоне.
isnullПроверка на NULL.
+

Q и F

+

Q нужен для сложной логики OR, AND, NOT. F нужен, чтобы обращаться к значениям полей на стороне БД.

+
Product.objects.filter(Q(name__icontains="web") | Q(description__icontains="web"))
+Product.objects.update(views=F("views") + 1)
+
+ aggregate() считает один итог по выборке и возвращает словарь. annotate() добавляет вычисляемое поле к каждому объекту. +
@@ -990,6 +1073,108 @@ box-sizing: border-box;

path(route, view, kwargs, name) задаёт маршрут. app_name задаёт namespace. В шаблоне URL строится так: {% url 'app:name' %}.

В шаблонах переменные пишутся как {{ value }}, теги как {% tag %}, фильтры как {{ value|lower }}. Если переменной нет, обычно выводится пустая строка.

forms.Form - обычная форма. forms.ModelForm - форма на основе модели. Для связи между полями используют общий метод clean(). После is_valid() доступны cleaned_data и errors.

+

Views

+
+
ViewКод, который принимает HTTP-запрос и возвращает HTTP-ответ.
+
FBVFunction-Based View. Представление как обычная функция.
+
CBVClass-Based View. Представление как класс с готовыми методами.
+
requestОбъект HTTP-запроса: метод, пользователь, GET/POST-данные, cookies.
+
render()Собирает HTML из шаблона и context, возвращает HTTP-ответ.
+
get_object_or_404()Получает объект или возвращает 404, если объект не найден.
+
+

CBV-классы

+ + + + + + + + +
КлассНазначение
TemplateViewПоказать шаблон без обязательной модели.
ListViewПоказать список объектов. Нужен model или queryset.
DetailViewПоказать один объект, обычно по pk или slug.
CreateViewСоздать объект через форму.
UpdateViewИзменить объект через форму.
DeleteViewУдалить объект, обычно после подтверждения.
+

Методы CBV

+ + + + + + + + + +
Метод/атрибутСмысл
as_view()Превращает класс view в callable для URL-маршрута.
get_queryset()Возвращает список объектов для ListView.
get_object()Возвращает один объект для DetailView.
get_context_data()Возвращает словарь context для шаблона.
context_object_nameЗадаёт имя переменной объекта/списка в шаблоне.
template_nameЯвно задаёт путь к шаблону.
paginate_byВключает пагинацию списка.
+

URLs

+
app_name = "blog"
+
+urlpatterns = [
+    path("posts/", PostListView.as_view(), name="post_list"),
+    path("posts/<int:pk>/", PostDetailView.as_view(), name="post_detail"),
+]
+
+
urlpatternsСписок маршрутов приложения или проекта.
+
path()Функция маршрутизации с простыми path-конвертерами.
+
re_path()Маршрут на основе регулярного выражения.
+
reverse()Строит URL по имени маршрута в Python.
+
nameИмя маршрута, чтобы не хардкодить URL.
+
app_nameNamespace приложения, например blog:post_list.
+
+

Path-конвертеры

+ + + + + + + +
КонвертерЧто принимает
<str:name>Строка без слеша. По умолчанию.
<int:pk>Положительное целое число.
<slug:slug>Строка из букв, цифр, дефиса и подчёркивания.
<uuid:id>UUID.
<path:subpath>Строка, которая может содержать слеши.
+

Django Template Language

+ + + + + + + + + + + + + +
СинтаксисСмысл
{{ variable }}Вывод переменной.
{% tag %}Шаблонный тег: цикл, условие, url, block.
{# comment #}Комментарий шаблона.
{{ value|lower }}Фильтр.
{% for item in items %}Цикл.
{{ forloop.counter }}Номер итерации цикла с 1.
{% extends "base.html" %}Наследование шаблона.
{% block content %}Область, которую переопределяет дочерний шаблон.
{% include "part.html" %}Включение другого шаблона.
{% load static %}Загрузка тегов static.
{% static "css/app.css" %}Путь к статическому файлу.
+

Django forms

+
+
forms.FormФорма без прямой привязки к модели.
+
forms.ModelFormФорма на основе модели. Поля задаются через Meta.
+
is_valid()Запускает валидацию формы.
+
cleaned_dataОчищенные и приведённые к Python-типам данные.
+
errorsОшибки формы.
+
clean_field()Валидация одного поля.
+
clean()Валидация всей формы, подходит для связи между полями.
+
widgetHTML-представление поля, например PasswordInput.
+
+ + + + + + + + + +
Поле формыНазначение
CharFieldСтрока.
IntegerFieldЦелое число.
BooleanFieldЛогическое значение.
ChoiceFieldВыбор из списка.
EmailFieldEmail.
DateFieldДата.
FileFieldФайл.
+
class RegisterForm(forms.Form):
+    password = forms.CharField(widget=forms.PasswordInput)
+    password_repeat = forms.CharField(widget=forms.PasswordInput)
+
+    def clean(self):
+        cleaned_data = super().clean()
+        if cleaned_data.get("password") != cleaned_data.get("password_repeat"):
+            raise forms.ValidationError("Пароли не совпадают")
+        return cleaned_data
+
+ Для проверки связи между полями нужен общий clean(), а не clean_password(), потому что сравниваются два значения. +
diff --git a/99 System/Export/Подготовка к экзамену по веб-разработке.pdf b/99 System/Export/Подготовка к экзамену по веб-разработке.pdf index 4a00b0a..15fd7a9 100644 Binary files a/99 System/Export/Подготовка к экзамену по веб-разработке.pdf and b/99 System/Export/Подготовка к экзамену по веб-разработке.pdf differ