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()select_related делает SQL JOIN для ForeignKey/OneToOne. prefetch_related делает отдельный запрос для ManyToMany и обратных связей.
models.Model и описывает таблицу БД.makemigrationsСоздаёт файлы миграций.migrateПрименяет миграции к базе данных.Class MetaВнутренний класс настроек модели: сортировка, имена, ограничения.objects.| Поле | Смысл |
|---|---|
CharField | Короткая строка. Требует max_length. |
TextField | Длинный текст без обязательного лимита длины. |
IntegerField | Целое число. |
DecimalField | Точное десятичное число, удобно для денег. Нужны max_digits, decimal_places. |
BooleanField | True или 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_NOTHING | Django ничего не делает, ответственность остаётся на БД/коде. |
QuerySet можно строить цепочкой, и Django не обязательно сразу идёт в БД. Запрос выполняется, когда данные реально нужны: цикл, индексация, вывод, list(), count(), exists().
qs = Product.objects.filter(is_active=True).order_by("-price")
+# БД ещё может не быть затронута
+for product in qs:
+ print(product.name)
+ | Lookup | Смысл |
|---|---|
exact | Точное совпадение. |
iexact | Точное совпадение без учёта регистра. |
contains | Содержит подстроку с учётом регистра. |
icontains | Содержит подстроку без учёта регистра. |
gt, gte | Больше, больше или равно. |
lt, lte | Меньше, меньше или равно. |
in | Значение входит в список. |
range | Значение в диапазоне. |
isnull | Проверка на NULL. |
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() добавляет вычисляемое поле к каждому объекту.
+ 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.
requestОбъект HTTP-запроса: метод, пользователь, GET/POST-данные, cookies.render()Собирает HTML из шаблона и context, возвращает HTTP-ответ.get_object_or_404()Получает объект или возвращает 404, если объект не найден.| Класс | Назначение |
|---|---|
TemplateView | Показать шаблон без обязательной модели. |
ListView | Показать список объектов. Нужен model или queryset. |
DetailView | Показать один объект, обычно по pk или slug. |
CreateView | Создать объект через форму. |
UpdateView | Изменить объект через форму. |
DeleteView | Удалить объект, обычно после подтверждения. |
| Метод/атрибут | Смысл |
|---|---|
as_view() | Превращает класс view в callable для URL-маршрута. |
get_queryset() | Возвращает список объектов для ListView. |
get_object() | Возвращает один объект для DetailView. |
get_context_data() | Возвращает словарь context для шаблона. |
context_object_name | Задаёт имя переменной объекта/списка в шаблоне. |
template_name | Явно задаёт путь к шаблону. |
paginate_by | Включает пагинацию списка. |
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.| Конвертер | Что принимает |
|---|---|
<str:name> | Строка без слеша. По умолчанию. |
<int:pk> | Положительное целое число. |
<slug:slug> | Строка из букв, цифр, дефиса и подчёркивания. |
<uuid:id> | UUID. |
<path:subpath> | Строка, которая может содержать слеши. |
| Синтаксис | Смысл |
|---|---|
{{ 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" %} | Путь к статическому файлу. |
forms.FormФорма без прямой привязки к модели.forms.ModelFormФорма на основе модели. Поля задаются через Meta.is_valid()Запускает валидацию формы.cleaned_dataОчищенные и приведённые к Python-типам данные.errorsОшибки формы.clean_field()Валидация одного поля.clean()Валидация всей формы, подходит для связи между полями.widgetHTML-представление поля, например PasswordInput.| Поле формы | Назначение |
|---|---|
CharField | Строка. |
IntegerField | Целое число. |
BooleanField | Логическое значение. |
ChoiceField | Выбор из списка. |
EmailField | Email. |
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(), потому что сравниваются два значения.
+