diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index 634f747..dc0536f 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -26,15 +26,12 @@ "id": "3e242b36cec6a5ec", "type": "leaf", "state": { - "type": "markdown", + "type": "pdf", "state": { - "file": "90 Library/Networking/Веб-аутентификация и авторизация.md", - "mode": "preview", - "source": false, - "backlinks": false + "file": "90 Library/Programming/Web/Подготовка к экзамену по веб-разработке.pdf" }, - "icon": "lucide-file", - "title": "Веб-аутентификация и авторизация" + "icon": "lucide-file-text", + "title": "Подготовка к экзамену по веб-разработке" } } ], @@ -159,7 +156,7 @@ "profileSourceId": "7004edff-76db-412f-95d3-5fd8e180d055", "serial": { "columns": 48, - "data": "\u001b[48;5;22m \u001b[2m \u001b[38;2;205;214;244;22mобно: Django models\u001b[38;2;205;214;244m\u001b[6X\r\n\u001b[39m \u001b[2m476 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-manyt\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22momany\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mMany-\u001b[38;2;137;180;250mto-\u001b[38;2;205;214;244mMany\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`ManyToM\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22manyField` задаёт связь многие-ко-многим\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m. Django создаёт промежуточную таблицу\u001b[1X\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mавтоматически\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m либо можно указать свою\u001b[1X\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mчерез `through`.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mdetail-li\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mnk\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-django-models\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодробно: D\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mjango models\u001b[38;2;205;214;244m\u001b[13X\r\n\u001b[39m \u001b[2m477 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-fbv\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mFBV\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mFunction-Based View — фу\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mнкция\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m которая принимает `request` и во\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mзвращает `HttpResponse`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `render`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `red\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mirect` или ошибку.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mdetail-\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mlink\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-django-fbv\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодробно: Dj\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mango FBV\u001b[38;2;205;214;244m\u001b[17X\r\n\u001b[39m \u001b[2m478 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-rende\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mr\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mrender\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`render(request\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mt\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22memplate\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m context)` рендерит шаблон с ко\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mнтекстом и возвращает `HttpResponse`.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-djang\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mo-fbv\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодробно: Django FBV\u001b[38;2;205;214;244m\u001b[37X\r\n\u001b[39m \u001b[2m479 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-conte\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mxt\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПередача данных в шаблон\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m>\u001b[38;2;205;214;244mДанные передаются словарём context: кл\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mючи становятся именами переменных в шаб\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mлоне.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22md-django-fbv\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодробно: Django FBV\u001b[38;2;205;214;244m<\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m/\u001b[38;2;137;180;250marticle\u001b[38;2;147;153;178m>\u001b[30X\r\n\u001b[39m \u001b[2m480 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-get-o\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mbject\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mОбъект или 404\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`get_o\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mbject_or_404(Model\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m pk=pk)` возвращает\u001b[1X\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mобъект или генерирует HTTP 404\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m если за\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mписи нет.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" hre\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mf=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-django-fbv\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодробно: Django FBV<\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m/\u001b[38;2;137;180;250ma\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m481 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-routi\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mng-fbv\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mМаршрутизация FBV\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m`urlpatterns` функция передаётся напрям\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mую: `\u001b[38;2;137;180;250mpath\u001b[38;2;205;214;244m(\"posts/<int\u001b[38;2;147;153;178m:\u001b[38;2;205;214;244mpk>/\", view\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22ms\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mdetail\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m name=\"detail\")`.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-django-fbv\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодр\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mобно: Django FBV\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m482 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-cbv-t\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mypes\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mTemplateView\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m DetailView\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m Lis\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mtView\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`TemplateView` показывает\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mшаблон\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `DetailView` — один объект\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `Li\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mstView` — список объектов.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-django-cbv\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодр\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mобно: Django CBV\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m483 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-cbv-m\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22models\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mCBV и модели\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mДля `Lis\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mtView`/`DetailView` можно указать `mode\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22ml = Post`; Django сам построит queryset\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m и стандартные имена шаблонов.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m cl\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mass=\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-django-cbv\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mПодробно: Django CBV\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m484 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-cbv-e\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mxtra\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mДополнительные данные\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mДополнительный контекст обычно добавляю\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mт через `get_context_data`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m вызывая `su\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mper()` и дополняя словарь.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-django-cbv\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодр\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mобно: Django CBV\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m485 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-cbv-d\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mefault-vars\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПеременные по умолчани\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mю\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`ListView` отдаёт `object_list\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m` и `modelname_list`; `DetailView` отда\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mёт `\u001b[38;2;137;180;250mobject\u001b[38;2;205;214;244m` и `modelname`.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-django-cbv\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодр\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mобно: Django CBV\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m486 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-cbv-q\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mueryset\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПереопределение выгрузки\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`get_queryset()` меняет список об\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mъектов, `get_object()` — получение одно\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mго объекта. Часто используют фильтрацию\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m по пользователю или статусу.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m cla\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mss=\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-django-cbv\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mП\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mодробно: Django CBV\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m487 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-pagin\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mation\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПаджинация\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ `ListVie\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mw` достаточно задать `paginate_by = N`;\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m в шаблоне появится `page_obj`.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m c\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mlass=\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-django-cbv\u001b[38;2;205;214;244m\"\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m>\u001b[38;2;205;214;244mПодробно: Django CBV\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m488 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-cbv-t\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22memplates\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mШаблоны по умолчанию\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mДля `DetailView`: `app/model_detail\u001b[38;2;147;153;178m.\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mhtml\u001b[38;2;205;214;244m`; для `ListView`: `app/model_list\u001b[38;2;147;153;178m.\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mhtml\u001b[38;2;205;214;244m`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m если не задан `template_name`.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-djang\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mo-cbv\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодробно: Django CBV\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m489 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-cbv-s\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22muper\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВызов базовой логики\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mП\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mри переопределении методов вроде `get_c\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22montext_data` обычно сначала вызывают `s\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22muper()`, чтобы не потерять стандартный\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mконтекст.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" hre\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mf=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-django-cbv\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодробно: Django CBV<\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m/\u001b[38;2;137;180;250ma\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m490 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-cbv-r\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mouting\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mМаршрутизация CBV\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mКл\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mасс подключается через `\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mas_view\u001b[38;2;205;214;244m()`: `\u001b[38;2;137;180;250mp\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22math\u001b[38;2;205;214;244m(\"\"\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m PostListView\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mas_view\u001b[38;2;205;214;244m(), name=\"p\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22most_list\")`.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\"\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-django-cbv\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодробно: Django C\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mBV\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m491 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-djang\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mo-urls\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDjango URLs\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`\u001b[38;2;137;180;250mpath\u001b[38;2;205;214;244m()`\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m задаёт маршрут, view\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m kwargs и имя. `r\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22me_path()` использует regex. `reverse()`\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m строит URL по имени маршрута.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m cl\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mass=\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-django-urls\u001b[38;2;205;214;244m\"\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m>\u001b[38;2;205;214;244mПодробно: Django URLs\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m492 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-djang\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mo-templates\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mЯзык шаблонов Django\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПеременные пишутся как `\u001b[38;2;147;153;178m{\u001b[38;2;205;214;244m{ value\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m}\u001b[38;2;205;214;244m}`, теги как `\u001b[38;2;147;153;178m{\u001b[38;2;205;214;244m% for %\u001b[38;2;147;153;178m}\u001b[38;2;205;214;244m`, фильтры как\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m`\u001b[38;2;147;153;178m{\u001b[38;2;205;214;244m{ name|lower \u001b[38;2;147;153;178m}\u001b[38;2;205;214;244m}`. Наследование делает\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mся через `extends` и `block`.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m cla\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mss=\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-django-templa\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mtes\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодробно: Django templates\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m493 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-djang\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mo-queries\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDjango queries\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mQu\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22merySet ленивый и цепочечный. Важно знат\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mь `get`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `\u001b[38;2;137;180;250mfilter\u001b[38;2;205;214;244m`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `exclude`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `order_by\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `annotate`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `aggregate`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `Q`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `F`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mselect_related`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `prefetch_related`.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-django\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22m-queries\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодробно: Django queries\u001b[38;2;205;214;244m<\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m/\u001b[38;2;137;180;250marticle\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m494 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-djang\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mo-forms\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDjango forms\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`forms\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m.\u001b[38;2;249;226;175mForm\u001b[38;2;205;214;244m` — ручная форма\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `ModelForm` стро\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mится по модели. Валидация через `is_val\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mid`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `cleaned_data`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `clean_field`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `cl\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mean`.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22md-django-forms\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодробно: Django forms<\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m/\u001b[38;2;137;180;250ma\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m495 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m496 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m497 \u001b[32;22m+\r\n\u001b[39m \u001b[2m498 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250msection\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mdetails\u001b[38;2;205;214;244m\" id=\"\u001b[38;2;137;180;250mdetails\u001b[38;2;205;214;244m\"\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m>\r\n\u001b[39m \u001b[2m499 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh2\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодробные заметки\r\n\u001b[39m \u001b[2m500 \u001b[32;22m+\r\n\u001b[39m \u001b[2m501 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-ip\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m502 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mIP-адресация\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m IPv4\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m IPv6\r\n\u001b[39m \u001b[2m503 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../../Networking/Протоколы/IP-адр\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mес\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mIP-адрес,\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"../../Net\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mworking/Протоколы/IPv6\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mIPv6\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m504 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ интернете используются адрес\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mа разных уровней: физический адрес инте\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mрфейса\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m сетевой IP-адрес и символьное D\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mNS-имя. IPv4 записывается четырьмя окте\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mтами\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m например `192.168.1.10`. IPv6 исп\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mользует 128 бит и записывается группами\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m шестнадцатеричных чисел.\r\n\u001b[39m \u001b[2m505 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте часто с\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mпрашивают: IPv4 = 32 бита\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m IPv6 = 128 б\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mит\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m IPv4 октет = 0-255\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m IPv6 не совмест\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mим напрямую с IPv4.\r\n\u001b[39m \u001b[2m506 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175ms-ip-ad\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mdressing\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткой теме\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m507 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m508 \u001b[32;22m+\r\n\u001b[39m \u001b[2m509 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-tcp\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m510 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mTCP\r\n\u001b[39m \u001b[2m511 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../../Networking/Протоколы/TCP vs\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m UDP\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mTCP vs UDP\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m512 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mTCP устанавливает соединение п\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mеред передачей данных\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m делит данные на\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mсегменты\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m нумерует их\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m подтверждает дос\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mтавку и повторяет потерянные данные. За\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m это платит дополнительными задержками\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mи служебным трафиком.\r\n\u001b[39m \u001b[2m513 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: TCP —\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mнадёжный\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mconnection-oriented\u001b[38;2;205;214;244m; UDP — бы\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mстрее и проще\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m но без гарантий доставки\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m и порядка.\r\n\u001b[39m \u001b[2m514 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175ms-tcp\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mНазад к краткой теме\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m515 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m516 \u001b[32;22m+\r\n\u001b[39m \u001b[2m517 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-subnet\u001b[38;2;205;214;244m\"\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m>\r\n\u001b[39m \u001b[2m518 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодсети и маска подсети\r\n\u001b[39m \u001b[2m519 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../../Networking/Подсети и маска\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mподсети\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодсети и маска подсети\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\r\n\u001b[39m \u001b[2m520 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mМаска подсети определяет\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m каки\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mе биты IPv4-адреса относятся к сети\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m а\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mкакие к хосту. Запись `/24` равна маске\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m `255.255.255.0`: первые 24 бита — сеть\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m,\u001b[38;2;205;214;244m последние 8 — хосты.\r\n\u001b[39m \u001b[2m521 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mЗапомнить: чем\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mбольше префикс `/N`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m тем меньше адресов\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m в подсети.\r\n\u001b[39m \u001b[2m522 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175ms-subne\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mt\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткой теме\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m523 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m524 \u001b[32;22m+\r\n\u001b[39m \u001b[2m525 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-nat\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m526 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mNAT\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m приватные адреса\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m localh\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22most\r\n\u001b[39m \u001b[2m527 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../../Networking/NAT\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mNAT,\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m <\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"../../Networking/Подсети и ма\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mска подсети\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодсети и маска подсети\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m528 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mNAT переводит приватные IPv4-а\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mдреса во внешний публичный адрес. Часты\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mе приватные диапазоны: `10.0.0.0/8`, `1\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m72.16.0.0/12`, `192.168.0.0/16`. Loopba\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mck-диапазон `127.0.0.0/8` не использует\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mся для обмена между узлами сети; `127.0\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m.0.1` и `localhost` указывают на текущу\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mю машину.\r\n\u001b[39m \u001b[2m529 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: NAT эк\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mономит публичные IPv4 и скрывает внутре\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mннюю адресацию\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m но ломает прямую \u001b[38;2;137;180;250mend-to\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22m-end\u001b[38;2;205;214;244m связность.\r\n\u001b[39m \u001b[2m530 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175ms-nat-l\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mocalhost\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткой теме\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m531 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m532 \u001b[32;22m+\r\n\u001b[39m \u001b[2m533 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-dns\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m534 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDNS и DNS-серверы\r\n\u001b[39m \u001b[2m535 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../../Networking/Протоколы/DNS\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDNS\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m536 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDNS — распределённая база данн\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mых\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m которая по доменному имени возвраща\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mет IP-адрес или другие записи. Типичная\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m цепочка: локальный кэш/hosts\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m resolver\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m провайдера\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mroot-серверы\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m TLD-серверы\u001b[38;2;147;153;178m,\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m авторитативные серверы домена.\r\n\u001b[39m \u001b[2m537 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: root н\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mе знает IP конкретного сайта\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m он направ\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mляет к TLD; авторитативный сервер знает\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m записи домена.\r\n\u001b[39m \u001b[2m538 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175ms-dns\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mНазад к краткой теме\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m539 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m540 \u001b[32;22m+\r\n\u001b[39m \u001b[2m541 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-http\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m542 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mHTTP и HTTP-сообщения\r\n\u001b[39m \u001b[2m543 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../../Networking/Протоколы/HTTP\u001b[38;2;147;153;178m,\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mHTTPS и HTTP3\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mHTTP\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m HTTPS и HTTP/3<\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m/\u001b[38;2;137;180;250ma\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m544 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mHTTP — протокол прикладного ур\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mовня. Запрос и ответ состоят из стартов\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mой строки\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m заголовков\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m пустой строки и\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mнеобязательного тела. Методы описывают\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mдействие над ресурсом\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m заголовки переда\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mют метаданные\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m коды ответа показывают р\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mезультат обработки.\r\n\u001b[39m \u001b[2m545 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mtable\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mtr\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mth\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mМетод\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mth\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mСмыс\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mл\u001b[38;2;205;214;244m\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mtr\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mtd\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`GET`\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mtd\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПолучи\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mть ресурс\u001b[38;2;205;214;244m\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mtr\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mtd\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`POST`\u001b[38;2;205;214;244m<\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mtd\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mОтправить данные\u001b[38;2;205;214;244m\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mtr\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mtd\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`P\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mUT`\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mtd\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mСоздать/заменить ресурс\u001b[38;2;205;214;244m\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mtr\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mtd\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`PATCH`\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mtd\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mЧастично\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mизменить ресурс\u001b[38;2;205;214;244m\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mtr\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mtd\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`DELET\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mE`\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mtd\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mУдалить ресурс\u001b[38;2;205;214;244m\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m546 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: `4xx`\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m— проблема на стороне клиента\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `5xx` —\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mпроблема на стороне сервера.\r\n\u001b[39m \u001b[2m547 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175ms-http\u001b[38;2;205;214;244m\"\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m>\u001b[38;2;205;214;244mНазад к HTTP\u001b[38;2;205;214;244m · <\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175ms-http-me\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mssage\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к HTTP-сообщениям\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m548 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m549 \u001b[32;22m+\r\n\u001b[39m \u001b[2m550 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-https\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m551 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mHTTPS\r\n\u001b[39m \u001b[2m552 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../../Networking/Протоколы/HTTP\u001b[38;2;147;153;178m,\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mHTTPS и HTTP3\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mHTTP\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m HTTPS и HTTP/3<\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m/\u001b[38;2;137;180;250ma\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m553 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mHTTPS — это HTTP\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m защищённый T\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mLS. Сертификат связывает домен с ключам\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mи и подтверждает подлинность сервера. T\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mLS обеспечивает шифрование\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m целостность\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m и защиту от подмены трафика.\r\n\u001b[39m \u001b[2m554 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: HTTP п\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mорт `80`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m HTTPS порт `443`; Basic auth\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mбез HTTPS небезопасен.\r\n\u001b[39m \u001b[2m555 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175ms-https\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткой теме\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m556 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m557 \u001b[32;22m+\r\n\u001b[39m \u001b[2m558 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-http3\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m559 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mHTTP/3\r\n\u001b[39m \u001b[2m560 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../../Networking/Протоколы/HTTP\u001b[38;2;147;153;178m,\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mHTTPS и HTTP3\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mHTTP\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m HTTPS и HTTP/3<\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m/\u001b[38;2;137;180;250ma\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m561 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mHTTP/3 переносит HTTP на QUIC\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mповерх UDP. QUIC делает потоки независи\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mмыми: потеря пакета не блокирует все за\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mпросы внутри соединения\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m как это возмож\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mно в HTTP/2 поверх TCP. TLS 1.3 встроен\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m в QUIC.\r\n\u001b[39m \u001b[2m562 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: HTTP/3\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m не меняет методы и коды HTTP\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m меняет т\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mранспорт: UDP/QUIC вместо TCP.\r\n\u001b[39m \u001b[2m563 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175ms-http3\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткой теме\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m564 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m565 \u001b[32;22m+\r\n\u001b[39m \u001b[2m566 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-ports\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m567 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mСетевые порты\r\n\u001b[39m \u001b[2m568 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../../Networking/Сетевые порты\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mСетевые порты\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m569 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПорт уточняет приложение-получ\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mателя внутри хоста. Номер порта находит\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mся в диапазоне `0-65535`. Порты TCP и U\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mDP независимы: `53/tcp` и `53/udp` — ра\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mзные конечные точки.\r\n\u001b[39m \u001b[2m570 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mМинимум к запом\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mинанию: HTTP `80`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m HTTPS `443`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m DNS `53\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m SSH `22`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m SMTP `25`.\r\n\u001b[39m \u001b[2m571 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175ms-ports\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткой теме\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m572 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m573 \u001b[32;22m+\r\n\u001b[39m \u001b[2m574 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-auth\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m575 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mИдентификация\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m аутентификация\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m,\u001b[38;2;205;214;244m авторизация\r\n\u001b[39m \u001b[2m576 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../../Networking/Веб-аутентификац\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mия и авторизация\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВеб-аутентификация\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m и авторизация\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m577 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mИдентификация сообщает системе\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m идентификатор субъекта. Аутентификация\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m проверяет подлинность. Авторизация выд\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mаёт права на действия. В HTTP встречают\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mся схемы Basic\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m Digest и Bearer.\r\n\u001b[39m \u001b[2m578 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте не пута\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mть: логин — идентификация\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m пароль/код —\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m аутентификация, доступ к админке — авт\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mоризация.\r\n\u001b[39m \u001b[2m579 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175ms-auth\u001b[38;2;205;214;244m\"\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m>\u001b[38;2;205;214;244mНазад к краткой теме\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m580 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m581 \u001b[32;22m+\r\n\u001b[39m \u001b[2m582 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-oauth\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m583 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mOAuth 2.0\r\n\u001b[39m \u001b[2m584 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../../Networking/OAuth 2.0\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mOA\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22muth 2.0\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m585 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mOAuth 2.0 позволяет стороннему\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m приложению получить ограниченный досту\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mп к ресурсам пользователя. Вместо парол\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mя приложение получает токен с конкретны\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mми правами и сроком жизни.\r\n\u001b[39m \u001b[2m586 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: OAuth\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m2.0 — авторизация\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m не парольная аутенти\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mфикация. Для входа поверх OAuth обычно\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mнужен OpenID Connect.\r\n\u001b[39m \u001b[2m587 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175ms-oauth\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткой теме\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m588 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m589 \u001b[32;22m+\r\n\u001b[39m \u001b[2m590 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-uri\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m591 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mURI\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m URL\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m URN\r\n\u001b[39m \u001b[2m592 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../../Networking/Протоколы/URI\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m U\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mRL\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m URN\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mURI\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m URL\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m URN\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m593 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mURL показывает\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m где находится\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mресурс и как его получить: схема\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m хост\u001b[38;2;147;153;178m,\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m порт\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m путь\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m параметры\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m фрагмент. URN з\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mадаёт стабильное имя ресурса без места\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mполучения. URI — общее понятие для иден\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mтификаторов ресурсов.\r\n\u001b[39m \u001b[2m594 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mГлавная формула\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m: URL ⊂ URI; URN ⊂ URI; не каждый URI я\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mвляется URL.\r\n\u001b[39m \u001b[2m595 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175ms-uri\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mНазад к краткой теме\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m596 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m597 \u001b[32;22m+\r\n\u001b[39m \u001b[2m598 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-html\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m599 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mHTML\r\n\u001b[39m \u001b[2m600 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"Основы HTML (структура\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m таблицы\u001b[38;2;147;153;178m,\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mформы)\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mОсновы HTML (структура\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m табл\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mицы\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m формы)\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m601 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mHTML описывает структуру докум\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mента. Важно знать базовый каркас\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m роль\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m`\u001b[38;2;137;180;250mhead\u001b[38;2;205;214;244m` и `\u001b[38;2;137;180;250mbody\u001b[38;2;205;214;244m`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m блочные и строчные эле\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mменты\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m семантические теги\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m атрибуты `cl\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mass`/`id`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m ссылки\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m изображения\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m списки\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mи таблицы.\r\n\u001b[39m \u001b[2m602 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: `class\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m` можно повторять\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `id` должен быть уни\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mкальным; таблицы — для табличных данных\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m,\u001b[38;2;205;214;244m не для макета.\r\n\u001b[39m \u001b[2m603 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175mblock-2\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткому блоку HTML\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m604 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m605 \u001b[32;22m+\r\n\u001b[39m \u001b[2m606 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-html-fo\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mrms\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m607 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mHTML Forms\r\n\u001b[39m \u001b[2m608 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"Основы HTML (структура\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m таблицы\u001b[38;2;147;153;178m,\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mформы)\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mОсновы HTML (структура\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m табл\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mицы\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m формы)\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m609 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mФорма отправляет данные на сер\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mвер. `action` задаёт URL\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `method` — сп\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mособ отправки. `\u001b[38;2;137;180;250mlabel\u001b[38;2;205;214;244m` связывается с по\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mлем через `for` и `id`. `name` определя\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mет имя параметра при отправке. `require\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22md` и типы \u001b[38;2;137;180;250minput\u001b[38;2;205;214;244m помогают браузерной вал\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mидации\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m но не заменяют серверную провер\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mку.\r\n\u001b[39m \u001b[2m610 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: у \u001b[38;2;137;180;250mradi\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mo-кнопок\u001b[38;2;205;214;244m одной группы должен быть одина\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mковый `name`; у `\u001b[38;2;137;180;250mbutton\u001b[38;2;205;214;244m` внутри формы л\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mучше явно задавать `type`.\r\n\u001b[39m \u001b[2m611 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175mblock-3\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткому блоку HTML Forms\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\r\n\u001b[39m \u001b[2m612 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m613 \u001b[32;22m+\r\n\u001b[39m \u001b[2m614 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-css-sel\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mectors\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m615 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mCSS selectors\r\n\u001b[39m \u001b[2m616 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"Основы\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m селекторы и блочная модел\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mь\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mCSS: Основы и селекторы\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m617 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mCSS-селектор выбирает элементы\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m,\u001b[38;2;205;214;244m к которым применяются правила. Нужно\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mразличать селекторы тега\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m класса\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m id\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m а\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mтрибута\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m псевдокласса и комбинаторы. Ка\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mскад учитывает важность\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m специфичность\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mи порядок правил.\r\n\u001b[39m \u001b[2m618 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mСпецифичность:\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22minline > ID > класс/атрибут/псевд\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mокласс > тег/псевдоэлемент.\r\n\u001b[39m \u001b[2m619 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175mblock-4\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткому блоку CSS\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m620 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m621 \u001b[32;22m+\r\n\u001b[39m \u001b[2m622 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-css-pro\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mps\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m623 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mCSS базовые свойства\r\n\u001b[39m \u001b[2m624 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"Основы\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m селекторы и блочная модел\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mь\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mCSS: Основы и селекторы\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m625 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mБлочная модель состоит из \u001b[38;2;137;180;250mcont\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22ment\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m padding\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m border и margin. `\u001b[38;2;137;180;250mbox-siz\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22ming\u001b[38;2;205;214;244m` меняет расчёт ширины. Текстовые св\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mойства управляют шрифтами\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m выравнивание\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mм\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m межстрочным расстоянием\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m расстоянием\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m между буквами и декором текста. Фон за\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mдаётся через группу `background-\u001b[38;2;137;180;250m*\u001b[38;2;205;214;244m`.\r\n\u001b[39m \u001b[2m626 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: `width\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m` при `\u001b[38;2;137;180;250mcontent-box\u001b[38;2;205;214;244m` не включает padding\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m/border\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m при `\u001b[38;2;137;180;250mborder-box\u001b[38;2;205;214;244m` включает.\r\n\u001b[39m \u001b[2m627 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175mblock-4\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткому блоку CSS\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m628 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m629 \u001b[32;22m+\r\n\u001b[39m \u001b[2m630 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-layout\u001b[38;2;205;214;244m\"\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m>\r\n\u001b[39m \u001b[2m631 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mFlexbox и Grid\r\n\u001b[39m \u001b[2m632 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"Адаптивность\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m Flexbox и Grid\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mCSS: Адаптивность\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m Flexbox и Grid\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m633 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mFlexbox — одномерная модель ра\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mскладки по главной и поперечной оси. Gr\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mid — двумерная сетка строк и колонок. F\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mlex удобен для распределения элементов\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mв строке или колонке\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m Grid — для общего\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m макета страницы.\r\n\u001b[39m \u001b[2m634 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: `\u001b[38;2;137;180;250mjusti\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mfy-content\u001b[38;2;205;214;244m` работает по главной оси fle\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mx\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `\u001b[38;2;137;180;250malign-items\u001b[38;2;205;214;244m` — по поперечной; `fr`\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m— доля свободного пространства Grid.\r\n\u001b[39m \u001b[2m635 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175mblock-5\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткому блоку Flex/Grid\u001b[38;2;205;214;244m<\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m/\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m636 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m637 \u001b[32;22m+\r\n\u001b[39m \u001b[2m638 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-django-\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mmodels\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m639 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDjango models\r\n\u001b[39m \u001b[2m640 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../Python/Модели и ORM\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDjango\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m Модели и ORM\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m641 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mМодели описывают структуру таб\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mлиц и связи между ними. `CharField` тре\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mбует `max_length`; `ForeignKey` задаёт\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m`on_delete`; `ManyToManyField` создаёт\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mпромежуточную таблицу или использует ук\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mазанную через `through`. Миграции перен\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mосят изменения моделей в БД.\r\n\u001b[39m \u001b[2m642 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: `null=\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mTrue` относится к БД\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `blank=True` — к\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mформам/валидации Django.\r\n\u001b[39m \u001b[2m643 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175mblock-d\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mjango\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткому блоку Django\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m644 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m645 \u001b[32;22m+\r\n\u001b[39m \u001b[2m646 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-django-\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mfbv\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m647 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDjango FBV\r\n\u001b[39m \u001b[2m648 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../Python/Представления, шаблоны\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mи CBV\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDjango: Представления\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m шаблон\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mы и CBV\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m649 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mFBV — обычная функция-представ\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mление. Она принимает `request`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m получае\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mт данные\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m вызывает `render` или возвращ\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mает другой `HttpResponse`. Маршрутизиру\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mется через `\u001b[38;2;137;180;250mpath\u001b[38;2;205;214;244m()` прямой передачей фу\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mнкции.\r\n\u001b[39m \u001b[2m650 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: `rende\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mr(request\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mtemplate\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m context)` возвраща\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mет HTTP-ответ; `get_object_or_404` возв\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mращает объект или 404.\r\n\u001b[39m \u001b[2m651 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175mblock-d\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mjango\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткому блоку Django\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m652 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m653 \u001b[32;22m+\r\n\u001b[39m \u001b[2m654 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-django-\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mcbv\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m655 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDjango CBV\r\n\u001b[39m \u001b[2m656 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../Python/Представления, шаблоны\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mи CBV\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDjango: Представления\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m шаблон\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mы и CBV\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m657 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mCBV — классовые представления\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mс готовой логикой. `TemplateView` показ\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mывает шаблон\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `ListView` выводит список\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m,\u001b[38;2;205;214;244m `DetailView` выводит один объект. В U\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mRL подключаются через `\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mas_view\u001b[38;2;205;214;244m()`.\r\n\u001b[39m \u001b[2m658 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: `ListV\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22miew` по умолчанию даёт `object_list`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mDetailView` — `\u001b[38;2;137;180;250mobject\u001b[38;2;205;214;244m`; шаблоны по умол\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mчанию `model_list\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mhtml\u001b[38;2;205;214;244m` и `model_detail\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m.\u001b[38;2;249;226;175mhtml\u001b[38;2;205;214;244m`.\r\n\u001b[39m \u001b[2m659 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175mblock-d\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mjango\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткому блоку Django\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m660 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m661 \u001b[32;22m+\r\n\u001b[39m \u001b[2m662 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-django-\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22murls\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m663 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDjango URLs\r\n\u001b[39m \u001b[2m664 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../Python/Представления, шаблоны\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mи CBV\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDjango: Представления\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m шаблон\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mы и CBV\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m665 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`urlpatterns` связывает URL с\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mпредставлениями. `\u001b[38;2;137;180;250mpath\u001b[38;2;205;214;244m()` использует ro\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mute\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m view\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m kwargs и name. Конвертеры вр\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mоде `int`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `slug`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `uuid`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `\u001b[38;2;137;180;250mpath\u001b[38;2;205;214;244m` извле\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mкают параметры. `reverse()` и `\u001b[38;2;147;153;178m{\u001b[38;2;205;214;244m% url %\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m}\u001b[38;2;205;214;244m` строят URL по имени маршрута.\r\n\u001b[39m \u001b[2m666 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: не хар\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mдкодить URL\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m если есть именованный марш\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mрут и `reverse`/`url`.\r\n\u001b[39m \u001b[2m667 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175ms-djang\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mo-urls\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткой теме\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m668 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m669 \u001b[32;22m+\r\n\u001b[39m \u001b[2m670 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-django-\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mtemplates\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m671 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mЯзык шаблонов Django\r\n\u001b[39m \u001b[2m672 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../Python/Представления, шаблоны\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mи CBV\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDjango: Представления\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m шаблон\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mы и CBV\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m673 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDTL использует переменные `\u001b[38;2;147;153;178m{\u001b[38;2;205;214;244m{\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mvalue \u001b[38;2;147;153;178m}\u001b[38;2;205;214;244m}`, теги `\u001b[38;2;147;153;178m{\u001b[38;2;205;214;244m% tag %\u001b[38;2;147;153;178m}\u001b[38;2;205;214;244m` и фильтры `\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m{\u001b[38;2;205;214;244m{ value|\u001b[38;2;137;180;250mfilter\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m}\u001b[38;2;205;214;244m}`. Наследование строи\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mтся через `\u001b[38;2;147;153;178m{\u001b[38;2;205;214;244m% extends %\u001b[38;2;147;153;178m}\u001b[38;2;205;214;244m` и `\u001b[38;2;147;153;178m{\u001b[38;2;205;214;244m% block %\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m}\u001b[38;2;205;214;244m`. Статика подключается через `\u001b[38;2;147;153;178m{\u001b[38;2;205;214;244m% load\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m static %\u001b[38;2;147;153;178m}\u001b[38;2;205;214;244m` и `\u001b[38;2;147;153;178m{\u001b[38;2;205;214;244m% static 'path' %\u001b[38;2;147;153;178m}\u001b[38;2;205;214;244m`.\r\n\u001b[39m \u001b[2m674 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: функци\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mи Python с произвольными аргументами на\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mпрямую из шаблона вызывать нельзя; испо\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mльзуют теги\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m фильтры или подготовку дан\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mных во view.\r\n\u001b[39m \u001b[2m675 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175ms-djang\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mo-templates\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткой теме\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m676 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m677 \u001b[32;22m+\r\n\u001b[39m \u001b[2m678 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-django-\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mqueries\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m679 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDjango queries\r\n\u001b[39m \u001b[2m680 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../Python/Модели и ORM\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDjango\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m Модели и ORM\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m681 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mQuerySet ленив: запрос выполня\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mется при фактическом обращении к данным\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m. Методы можно цепочечно комбинировать.\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m `get()` возвращает один объект или оши\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mбку, `\u001b[38;2;137;180;250mfilter\u001b[38;2;205;214;244m()` возвращает QuerySet\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `a\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mggregate()` возвращает итоговый словарь\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m, `annotate()` добавляет вычисляемые по\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mля к объектам.\r\n\u001b[39m \u001b[2m682 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: `selec\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mt_related` — для ForeignKey/OneToOne че\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mрез JOIN; `prefetch_related` — для Many\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mToMany и обратных связей отдельными зап\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mросами.\r\n\u001b[39m \u001b[2m683 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175ms-djang\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mo-queries\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткой теме\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m684 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m685 \u001b[32;22m+\r\n\u001b[39m \u001b[2m686 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-django-\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mforms\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m687 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDjango forms\r\n\u001b[39m \u001b[2m688 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../Python/Работа с формами и CUD\u001b[38;2;147;153;178m.\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDjango: Работа с формами и CUD\u001b[38;2;205;214;244m<\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m/\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m689 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`forms\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mForm\u001b[38;2;205;214;244m` описывает форму в\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mручную\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `forms\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mModelForm\u001b[38;2;205;214;244m` строится по м\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mодели через `Meta`. `is_valid()` запуск\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mает валидацию, `cleaned_data` содержит\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mочищенные данные\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `clean_\u001b[38;2;205;214;244m()` вал\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mидирует поле, `clean()` — форму целиком\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m. `widget` управляет HTML-представление\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mм поля.\r\n\u001b[39m \u001b[2m690 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: `\u001b[38;2;137;180;250mform\u001b[38;2;147;153;178m.\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22msave\u001b[38;2;205;214;244m()` есть у ModelForm; серверная вал\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mидация обязательна\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m HTML `required` не\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mзащита.\r\n\u001b[39m \u001b[2m691 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175ms-djang\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mo-forms\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткой теме\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m692 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m693 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m694 \u001b[32;22m+\r\n\u001b[39m \u001b[2m695 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175mtop\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНаверх\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m696 \u001b[32;22m+\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m697 \u001b[32;22m+\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m698 \u001b[32;22m+\u001b[38;2;205;214;244m\r\n\u001b[0m\u001b[48X\r\n\u001b[2m────────────────────────────────────────────────\r\n\r\n• \u001b[0mHTML собран. Проверяю технические вещи:\r\n повторяющиеся якоря, наличие целевых файлов и\r\n возможность напечатать PDF через headless\r\n Chromium.\r\n\r\n\u001b[32;1m•\u001b[0m \u001b[1mRan\u001b[0m \u001b[38;2;137;180;250mwhich\u001b[38;2;205;214;244m chromium\r\n\u001b[39;2m └ /usr/bin/chromium\r\n\r\n\u001b[31;1;22m•\u001b[0m \u001b[1mRan\u001b[0m \u001b[38;2;137;180;250mrtk\u001b[38;2;205;214;244m grep\u001b[38;2;147;153;178m -\u001b[38;2;235;160;172mo\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m\"id=\u001b[38;2;245;194;231m\\\"\u001b[38;2;166;227;161m[^\"\u001b[38;2;205;214;244m]+\u001b[38;2;245;194;231m\\\"\u001b[38;2;166;227;161m\" \"\u001b[38;2;205;214;244m90 Library/\r\n\u001b[39;2m │ \u001b[38;2;205;214;244;22mProgramming/Web/Подготовка к экзамену по\r\n\u001b[39;2m │ \u001b[38;2;205;214;244;22mвеб-разработке.html\u001b[38;2;166;227;161m\"\r\n\u001b[39;2m └ zsh:1: unmatched \"\r\n\r\n\u001b[32;1;22m•\u001b[0m \u001b[1mRan\u001b[0m \u001b[38;2;137;180;250mrtk\u001b[38;2;205;214;244m git diff\u001b[38;2;147;153;178m --\u001b[38;2;235;160;172mstat\r\n\u001b[39;2m └ .obsidian/workspace.json | 28 ++++++++++++\r\n\u001b[0m \u001b[2m++--------------\r\n\u001b[0m \u001b[2m 1 file changed, 14 insertions(+), 14\r\n\u001b[0m \u001b[2mdeletions(-)\r\n\r\n────────────────────────────────────────────────\r\n\r\n• \u001b[0mОдна проверочная команда сломалась на\r\n кавычках, без влияния на файлы. Повторяю её\r\n нормальной quoting-командой и сразу исправлю\r\n найденные дубли якорей, если будут.\r\n\r\n\u001b[32;1m•\u001b[0m \u001b[1mRan\u001b[0m \u001b[38;2;137;180;250mrtk\u001b[38;2;205;214;244m git status\u001b[38;2;147;153;178m --\u001b[38;2;235;160;172mshort\r\n\u001b[39;2m └ M .obsidian/workspace.json\r\n\u001b[0m \u001b[2m?? \"90 Library/Programming/Web/Подготовка к\r\n\u001b[0m \u001b[2mэкзамену по веб-разработке.html\"\r\n\r\n\u001b[31;1;22m•\u001b[0m \u001b[1mRan\u001b[0m \u001b[38;2;137;180;250mrtk\u001b[38;2;205;214;244m grep\u001b[38;2;147;153;178m -\u001b[38;2;235;160;172mo\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m'id=\"[^\"]+\"'\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m\"90 Library/\r\n\u001b[39;2m │ \u001b[38;2;166;227;161;22mProgramming/Web/Подготовка к экзамену по\r\n\u001b[39;2m │ \u001b[38;2;166;227;161;22mвеб-разработке.html\"\r\n\u001b[39;2m └ (no output)\r\n\r\n────────────────────────────────────────────────\r\n\r\n• \u001b[36;22mrg\u001b[0m с шаблоном для атрибутов не поймал HTML,\r\n поэтому проверю через более простые поиски по\r\n \u001b[36mid=\u001b[0m и ссылкам. Заодно вижу, что \u001b[36m.obsidian/\r\n\u001b[0m \u001b[36mworkspace.json\u001b[0m уже изменён вне моей задачи,\r\n его не трогаю.\r\n\r\n\u001b[31;1m•\u001b[0m \u001b[1mRan\u001b[0m \u001b[38;2;137;180;250mrtk\u001b[38;2;205;214;244m grep\u001b[38;2;147;153;178m -\u001b[38;2;235;160;172mn\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m\"href=\u001b[38;2;245;194;231m\\\"\u001b[38;2;166;227;161m#[^\"\u001b[38;2;205;214;244m]+\u001b[38;2;245;194;231m\\\"\u001b[38;2;166;227;161m\" \"\u001b[38;2;205;214;244m90 Library/\r\n\u001b[39;2m │ \u001b[38;2;205;214;244;22mProgramming/Web/Подготовка к экзамену по\r\n\u001b[39;2m │ \u001b[38;2;205;214;244;22mвеб-разработке.html\u001b[38;2;166;227;161m\"\r\n\u001b[39;2m └ zsh:1: unmatched \"\r\n\r\n\u001b[32;1;22m•\u001b[0m \u001b[1mRan\u001b[0m \u001b[38;2;137;180;250mrtk\u001b[38;2;205;214;244m grep\u001b[38;2;147;153;178m -\u001b[38;2;235;160;172mn\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m\"href=\u001b[38;2;245;194;231m\\\"\u001b[38;2;166;227;161m#s-meta\u001b[38;2;245;194;231m\\\"\u001b[38;2;166;227;161m|\r\n\u001b[39;2m │ \u001b[38;2;166;227;161;22mid=\u001b[38;2;245;194;231m\\\"\u001b[38;2;166;227;161ms-meta\u001b[38;2;245;194;231m\\\"\u001b[38;2;166;227;161m\"\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m\"90 Library/Programming/\r\n\u001b[39;2m │ \u001b[38;2;166;227;161;22mWeb/Подготовка к экзамену по\r\n\u001b[39;2m │ … +1 lines\r\n └ 4 matches in 3F:\r\n\r\n … +11 lines (ctrl + t to view transcript)\r\n\u001b[0m \u001b[2m 300: Class Meta\r\n\r\n\r\n\u001b[32;1;22m•\u001b[0m \u001b[1mRan\u001b[0m \u001b[38;2;137;180;250mrtk\u001b[38;2;205;214;244m grep\u001b[38;2;147;153;178m -\u001b[38;2;235;160;172mn\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m\"id=\"\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m\"90 Library/Programming/\r\n\u001b[39;2m │ \u001b[38;2;166;227;161;22mWeb/Подготовка к экзамену по\r\n\u001b[39;2m │ \u001b[38;2;166;227;161;22mвеб-разработке.html\"\r\n\u001b[39;2m └ 115 matches in 71F:\r\n\r\n … +237 lines (ctrl + t to view transcript)\r\n\r\n\u001b[0m \u001b[2m... +20\r\n\r\n────────────────────────────────────────────────\r\n\r\n• \u001b[0mНашёл реальный конфликт якоря \u001b[36ms-meta\u001b[0m: HTML\r\n meta-теги и Django \u001b[36mClass Meta\u001b[0m. Исправляю\r\n Django-якорь на отдельный \u001b[36ms-django-meta\u001b[0m.\r\n\r\n\u001b[2m• \u001b[1;22mEdited\u001b[0m 90 Library/Programming/Web/Подготовка к\r\nэкзамену по веб-разработке.html (\u001b[32m+2\u001b[0m \u001b[31m-2\u001b[0m)\r\n \u001b[2m299 \u001b[0m \u001b[38;2;205;214;244m \u001b[38;2;148;226;213m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mhref\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"#s-migrations\"\u001b[38;2;148;226;213m>\u001b[38;2;205;214;244mМиграци\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22mи\u001b[38;2;148;226;213m\r\n\u001b[39;48;5;52m \u001b[2m300 \u001b[31;22m-\u001b[38;2;205;214;244;2m \u001b[38;2;148;226;213m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mhref\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"#s-meta\"\u001b[38;2;148;226;213m>\u001b[38;2;205;214;244mClass Meta\u001b[38;2;148;226;213m\r\n\u001b[39;48;5;22;22m \u001b[2m300 \u001b[32;22m+\u001b[38;2;205;214;244m \u001b[38;2;148;226;213m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mhref\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"#s-django-meta\"\u001b[38;2;148;226;213m>\u001b[38;2;205;214;244mClass\u001b[1X\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mMeta\u001b[38;2;148;226;213m\r\n\u001b[0m \u001b[2m301 \u001b[0m \u001b[38;2;205;214;244m \u001b[38;2;148;226;213m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mhref\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"#s-null-blank\"\u001b[38;2;148;226;213m>\u001b[38;2;205;214;244mnull/bl\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22mank\u001b[38;2;148;226;213m\r\n\u001b[0m \u001b[2m ⋮\r\n\u001b[0m \u001b[2m471 \u001b[0m \u001b[38;2;205;214;244m \u001b[38;2;148;226;213m<\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mclass\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"card\"\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mid\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"s-migra\r\n\u001b[0m \u001b[2m \u001b[38;2;166;227;161;22mtions\"\u001b[38;2;148;226;213m><\u001b[38;2;137;180;250mh3\u001b[38;2;148;226;213m>\u001b[38;2;205;214;244mМиграции\u001b[38;2;148;226;213m<\u001b[38;2;137;180;250mp\u001b[38;2;148;226;213m>\u001b[38;2;205;214;244m`makemigrati\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22mons` создаёт файлы миграций из изменени\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22mй моделей, `migrate` применяет их к баз\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22mе данных.\u001b[38;2;148;226;213m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mclass\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"detail-link\"\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mhre\r\n\u001b[0m \u001b[2m \u001b[38;2;249;226;175;22mf\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"#d-django-models\"\u001b[38;2;148;226;213m>\u001b[38;2;205;214;244mПодробно: Django m\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22models\u001b[38;2;148;226;213m\r\n\u001b[39;48;5;52m \u001b[2m472 \u001b[31;22m-\u001b[38;2;205;214;244;2m \u001b[38;2;148;226;213m<\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mclass\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"card\"\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mid\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"s-meta\"\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22m уровне форм/валидации Django.\u001b[38;2;148;226;213m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mcl\r\n\u001b[0m \u001b[2m \u001b[38;2;249;226;175;22mass\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"detail-link\"\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mhref\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"#d-django-model\r\n\u001b[0m \u001b[2m \u001b[38;2;166;227;161;22ms\"\u001b[38;2;148;226;213m>\u001b[38;2;205;214;244mПодробно: Django models\u001b[38;2;148;226;213m\u001b[0m и\r\n \u001b[36m
\u001b[0m. Браузер может воспринять их как\r\n разметку, поэтому экранирую такие примеры и\r\n пересоберу PDF.\r\n\r\n\u001b[32;1m•\u001b[0m \u001b[1mRan\u001b[0m \u001b[38;2;137;180;250mrtk\u001b[38;2;205;214;244m grep\u001b[38;2;147;153;178m -\u001b[38;2;235;160;172mn\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m\"<(doctype|html|head|body|\r\n\u001b[39;2m │ \u001b[38;2;166;227;161;22mtitle|meta|link|style|script|div|p|\r\n\u001b[39;2m │ \u001b[38;2;166;227;161;22msection|span|a |img|br|form|label|input|\r\n\u001b[39;2m │ … +5 lines\r\n └ 351 matches in 145F:\r\n\r\n … +460 lines (ctrl + t to view transcript)\r\n\r\n\u001b[0m \u001b[2m... +182\r\n\r\n────────────────────────────────────────────────\r\n\r\n• \u001b[0mЭкранировать нужно не весь файл, а только\r\n примеры тегов внутри учебного текста. Правлю\r\n эти строки вручную, чтобы не задеть настоящую\r\n HTML-разметку документа.\r\n\r\n\u001b[2m•\u001b[1C\u001b[1;22mExplored\r\n\u001b[22;2m └ \u001b[36;22mRead\u001b[1C\u001b[0mПодготовка\u001b[1Cк\u001b[1Cэкзамену\u001b[1Cпо\u001b[1Cвеб-\r\n\u001b[9Cразработке.html\r\n\r\n•\u001b[1C\u001b[2mWorking\u001b[1C(2m 50s • esc to interrupt)\r\n\r\n\u001b[48;5;238;22m \u001b[47X\r\n\u001b[1m›\u001b[22m \u001b[2mSummarize recent commits\r\n\u001b[22m \r\n\u001b[0m\u001b[2X\u001b[2C\u001b[38;2;246;226;183mgpt-5.5 high\u001b[39;2m · \u001b[38;2;171;223;167;22m~/Documents/Vaults/SecondBrain\u001b[1X\u001b[2A\u001b[45D\u001b[0m", + "data": "\u001b[48;5;22m \u001b[2m \u001b[38;2;205;214;244;22mНазад к краткой теме\u001b[38;2;205;214;244m\u001b[11X\r\n\u001b[39m \u001b[2m596 \u001b[32;22m+\u001b[38;2;205;214;244m \u001b[25X\r\n\u001b[39m \u001b[2m597 \u001b[32;22m+\u001b[39X\r\n\u001b[39m \u001b[2m598 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-html\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[1X\r\n\u001b[39m \u001b[2m599 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mHTML\u001b[20X\r\n\u001b[39m \u001b[2m600 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\u001b[1X\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"Основы HTML (структура\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m таблицы\u001b[38;2;147;153;178m,\u001b[1X\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mформы)\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mОсновы HTML (структура\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m табл\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mицы\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m формы)\u001b[38;2;205;214;244m\u001b[20X\r\n\u001b[39m \u001b[2m601 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mHTML описывает структуру докум\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mента. Важно знать базовый каркас\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m роль\u001b[1X\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m`\u001b[38;2;137;180;250mhead\u001b[38;2;205;214;244m` и `\u001b[38;2;137;180;250mbody\u001b[38;2;205;214;244m`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m блочные и строчные эле\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mменты\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m семантические теги\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m атрибуты `cl\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mass`/`id`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m ссылки\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m изображения\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m списки\u001b[1X\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mи таблицы.\u001b[25X\r\n\u001b[39m \u001b[2m602 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: `class\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m` можно повторять\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `id` должен быть уни\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mкальным; таблицы — для табличных данных\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m,\u001b[38;2;205;214;244m не для макета.\u001b[17X\r\n\u001b[39m \u001b[2m603 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175mblock-2\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткому блоку HTML\u001b[38;2;205;214;244m\u001b[2X\r\n\u001b[39m \u001b[2m604 \u001b[32;22m+\u001b[38;2;205;214;244m \u001b[25X\r\n\u001b[39m \u001b[2m605 \u001b[32;22m+\u001b[39X\r\n\u001b[39m \u001b[2m606 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-html-fo\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mrms\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[34X\r\n\u001b[39m \u001b[2m607 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mHTML Forms\u001b[14X\r\n\u001b[39m \u001b[2m608 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\u001b[1X\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"Основы HTML (структура\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m таблицы\u001b[38;2;147;153;178m,\u001b[1X\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mформы)\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mОсновы HTML (структура\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m табл\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mицы\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m формы)\u001b[38;2;205;214;244m\u001b[20X\r\n\u001b[39m \u001b[2m609 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mФорма отправляет данные на сер\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mвер. `action` задаёт URL\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `method` — сп\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mособ отправки. `\u001b[38;2;137;180;250mlabel\u001b[38;2;205;214;244m` связывается с по\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mлем через `for` и `id`. `name` определя\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mет имя параметра при отправке. `require\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22md` и типы \u001b[38;2;137;180;250minput\u001b[38;2;205;214;244m помогают браузерной вал\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mидации\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m но не заменяют серверную провер\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mку.\r\n\u001b[39m \u001b[2m610 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: у \u001b[38;2;137;180;250mradi\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mo-кнопок\u001b[38;2;205;214;244m одной группы должен быть одина\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mковый `name`; у `\u001b[38;2;137;180;250mbutton\u001b[38;2;205;214;244m` внутри формы л\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mучше явно задавать `type`.\r\n\u001b[39m \u001b[2m611 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175mblock-3\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткому блоку HTML Forms\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\r\n\u001b[39m \u001b[2m612 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m613 \u001b[32;22m+\r\n\u001b[39m \u001b[2m614 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-css-sel\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mectors\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m615 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mCSS selectors\r\n\u001b[39m \u001b[2m616 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"Основы\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m селекторы и блочная модел\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mь\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mCSS: Основы и селекторы\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m617 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mCSS-селектор выбирает элементы\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m,\u001b[38;2;205;214;244m к которым применяются правила. Нужно\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mразличать селекторы тега\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m класса\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m id\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m а\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mтрибута\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m псевдокласса и комбинаторы. Ка\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mскад учитывает важность\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m специфичность\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mи порядок правил.\r\n\u001b[39m \u001b[2m618 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mСпецифичность:\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22minline > ID > класс/атрибут/псевд\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mокласс > тег/псевдоэлемент.\r\n\u001b[39m \u001b[2m619 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175mblock-4\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткому блоку CSS\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m620 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m621 \u001b[32;22m+\r\n\u001b[39m \u001b[2m622 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-css-pro\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mps\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m623 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mCSS базовые свойства\r\n\u001b[39m \u001b[2m624 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"Основы\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m селекторы и блочная модел\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mь\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mCSS: Основы и селекторы\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m625 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mБлочная модель состоит из \u001b[38;2;137;180;250mcont\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22ment\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m padding\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m border и margin. `\u001b[38;2;137;180;250mbox-siz\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22ming\u001b[38;2;205;214;244m` меняет расчёт ширины. Текстовые св\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mойства управляют шрифтами\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m выравнивание\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mм\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m межстрочным расстоянием\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m расстоянием\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m между буквами и декором текста. Фон за\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mдаётся через группу `background-\u001b[38;2;137;180;250m*\u001b[38;2;205;214;244m`.\r\n\u001b[39m \u001b[2m626 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: `width\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m` при `\u001b[38;2;137;180;250mcontent-box\u001b[38;2;205;214;244m` не включает padding\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m/border\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m при `\u001b[38;2;137;180;250mborder-box\u001b[38;2;205;214;244m` включает.\r\n\u001b[39m \u001b[2m627 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175mblock-4\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткому блоку CSS\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m628 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m629 \u001b[32;22m+\r\n\u001b[39m \u001b[2m630 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-layout\u001b[38;2;205;214;244m\"\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m>\r\n\u001b[39m \u001b[2m631 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mFlexbox и Grid\r\n\u001b[39m \u001b[2m632 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"Адаптивность\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m Flexbox и Grid\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mCSS: Адаптивность\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m Flexbox и Grid\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m633 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mFlexbox — одномерная модель ра\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mскладки по главной и поперечной оси. Gr\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mid — двумерная сетка строк и колонок. F\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mlex удобен для распределения элементов\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mв строке или колонке\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m Grid — для общего\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m макета страницы.\r\n\u001b[39m \u001b[2m634 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: `\u001b[38;2;137;180;250mjusti\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mfy-content\u001b[38;2;205;214;244m` работает по главной оси fle\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mx\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `\u001b[38;2;137;180;250malign-items\u001b[38;2;205;214;244m` — по поперечной; `fr`\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m— доля свободного пространства Grid.\r\n\u001b[39m \u001b[2m635 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175mblock-5\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткому блоку Flex/Grid\u001b[38;2;205;214;244m<\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m/\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m636 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m637 \u001b[32;22m+\r\n\u001b[39m \u001b[2m638 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-django-\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mmodels\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m639 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDjango models\r\n\u001b[39m \u001b[2m640 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../Python/Модели и ORM\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDjango\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m Модели и ORM\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m641 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mМодели описывают структуру таб\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mлиц и связи между ними. `CharField` тре\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mбует `max_length`; `ForeignKey` задаёт\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m`on_delete`; `ManyToManyField` создаёт\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mпромежуточную таблицу или использует ук\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mазанную через `through`. Миграции перен\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mосят изменения моделей в БД.\r\n\u001b[39m \u001b[2m642 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: `null=\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mTrue` относится к БД\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `blank=True` — к\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mформам/валидации Django.\r\n\u001b[39m \u001b[2m643 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175mblock-d\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mjango\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткому блоку Django\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m644 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m645 \u001b[32;22m+\r\n\u001b[39m \u001b[2m646 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-django-\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mfbv\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m647 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDjango FBV\r\n\u001b[39m \u001b[2m648 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../Python/Представления, шаблоны\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mи CBV\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDjango: Представления\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m шаблон\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mы и CBV\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m649 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mFBV — обычная функция-представ\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mление. Она принимает `request`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m получае\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mт данные\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m вызывает `render` или возвращ\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mает другой `HttpResponse`. Маршрутизиру\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mется через `\u001b[38;2;137;180;250mpath\u001b[38;2;205;214;244m()` прямой передачей фу\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mнкции.\r\n\u001b[39m \u001b[2m650 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: `rende\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mr(request\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mtemplate\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m context)` возвраща\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mет HTTP-ответ; `get_object_or_404` возв\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mращает объект или 404.\r\n\u001b[39m \u001b[2m651 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175mblock-d\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mjango\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткому блоку Django\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m652 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m653 \u001b[32;22m+\r\n\u001b[39m \u001b[2m654 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-django-\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mcbv\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m655 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDjango CBV\r\n\u001b[39m \u001b[2m656 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../Python/Представления, шаблоны\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mи CBV\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDjango: Представления\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m шаблон\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mы и CBV\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m657 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mCBV — классовые представления\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mс готовой логикой. `TemplateView` показ\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mывает шаблон\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `ListView` выводит список\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m,\u001b[38;2;205;214;244m `DetailView` выводит один объект. В U\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mRL подключаются через `\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mas_view\u001b[38;2;205;214;244m()`.\r\n\u001b[39m \u001b[2m658 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: `ListV\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22miew` по умолчанию даёт `object_list`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mDetailView` — `\u001b[38;2;137;180;250mobject\u001b[38;2;205;214;244m`; шаблоны по умол\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mчанию `model_list\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mhtml\u001b[38;2;205;214;244m` и `model_detail\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m.\u001b[38;2;249;226;175mhtml\u001b[38;2;205;214;244m`.\r\n\u001b[39m \u001b[2m659 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175mblock-d\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mjango\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткому блоку Django\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m660 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m661 \u001b[32;22m+\r\n\u001b[39m \u001b[2m662 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-django-\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22murls\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m663 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDjango URLs\r\n\u001b[39m \u001b[2m664 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../Python/Представления, шаблоны\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mи CBV\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDjango: Представления\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m шаблон\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mы и CBV\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m665 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`urlpatterns` связывает URL с\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mпредставлениями. `\u001b[38;2;137;180;250mpath\u001b[38;2;205;214;244m()` использует ro\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mute\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m view\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m kwargs и name. Конвертеры вр\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mоде `int`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `slug`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `uuid`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `\u001b[38;2;137;180;250mpath\u001b[38;2;205;214;244m` извле\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mкают параметры. `reverse()` и `\u001b[38;2;147;153;178m{\u001b[38;2;205;214;244m% url %\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m}\u001b[38;2;205;214;244m` строят URL по имени маршрута.\r\n\u001b[39m \u001b[2m666 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: не хар\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mдкодить URL\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m если есть именованный марш\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mрут и `reverse`/`url`.\r\n\u001b[39m \u001b[2m667 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175ms-djang\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mo-urls\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткой теме\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m668 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m669 \u001b[32;22m+\r\n\u001b[39m \u001b[2m670 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-django-\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mtemplates\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m671 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mЯзык шаблонов Django\r\n\u001b[39m \u001b[2m672 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../Python/Представления, шаблоны\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mи CBV\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDjango: Представления\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m шаблон\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mы и CBV\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m673 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDTL использует переменные `\u001b[38;2;147;153;178m{\u001b[38;2;205;214;244m{\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mvalue \u001b[38;2;147;153;178m}\u001b[38;2;205;214;244m}`, теги `\u001b[38;2;147;153;178m{\u001b[38;2;205;214;244m% tag %\u001b[38;2;147;153;178m}\u001b[38;2;205;214;244m` и фильтры `\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m{\u001b[38;2;205;214;244m{ value|\u001b[38;2;137;180;250mfilter\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m}\u001b[38;2;205;214;244m}`. Наследование строи\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mтся через `\u001b[38;2;147;153;178m{\u001b[38;2;205;214;244m% extends %\u001b[38;2;147;153;178m}\u001b[38;2;205;214;244m` и `\u001b[38;2;147;153;178m{\u001b[38;2;205;214;244m% block %\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m}\u001b[38;2;205;214;244m`. Статика подключается через `\u001b[38;2;147;153;178m{\u001b[38;2;205;214;244m% load\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m static %\u001b[38;2;147;153;178m}\u001b[38;2;205;214;244m` и `\u001b[38;2;147;153;178m{\u001b[38;2;205;214;244m% static 'path' %\u001b[38;2;147;153;178m}\u001b[38;2;205;214;244m`.\r\n\u001b[39m \u001b[2m674 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: функци\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mи Python с произвольными аргументами на\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mпрямую из шаблона вызывать нельзя; испо\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mльзуют теги\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m фильтры или подготовку дан\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mных во view.\r\n\u001b[39m \u001b[2m675 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175ms-djang\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mo-templates\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткой теме\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m676 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m677 \u001b[32;22m+\r\n\u001b[39m \u001b[2m678 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-django-\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mqueries\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m679 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDjango queries\r\n\u001b[39m \u001b[2m680 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../Python/Модели и ORM\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDjango\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m Модели и ORM\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m681 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mQuerySet ленив: запрос выполня\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mется при фактическом обращении к данным\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m. Методы можно цепочечно комбинировать.\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m `get()` возвращает один объект или оши\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mбку, `\u001b[38;2;137;180;250mfilter\u001b[38;2;205;214;244m()` возвращает QuerySet\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `a\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mggregate()` возвращает итоговый словарь\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m, `annotate()` добавляет вычисляемые по\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mля к объектам.\r\n\u001b[39m \u001b[2m682 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: `selec\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mt_related` — для ForeignKey/OneToOne че\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mрез JOIN; `prefetch_related` — для Many\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mToMany и обратных связей отдельными зап\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mросами.\r\n\u001b[39m \u001b[2m683 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175ms-djang\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mo-queries\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткой теме\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m684 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m685 \u001b[32;22m+\r\n\u001b[39m \u001b[2m686 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-django-\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mforms\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m687 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDjango forms\r\n\u001b[39m \u001b[2m688 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../Python/Работа с формами и CUD\u001b[38;2;147;153;178m.\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDjango: Работа с формами и CUD\u001b[38;2;205;214;244m<\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m/\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m689 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`forms\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mForm\u001b[38;2;205;214;244m` описывает форму в\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mручную\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `forms\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mModelForm\u001b[38;2;205;214;244m` строится по м\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mодели через `Meta`. `is_valid()` запуск\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mает валидацию, `cleaned_data` содержит\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mочищенные данные\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `clean_\u001b[38;2;205;214;244m()` вал\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mидирует поле, `clean()` — форму целиком\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m. `widget` управляет HTML-представление\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mм поля.\r\n\u001b[39m \u001b[2m690 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: `\u001b[38;2;137;180;250mform\u001b[38;2;147;153;178m.\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22msave\u001b[38;2;205;214;244m()` есть у ModelForm; серверная вал\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mидация обязательна\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m HTML `required` не\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mзащита.\r\n\u001b[39m \u001b[2m691 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175ms-djang\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mo-forms\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткой теме\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m692 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m693 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m694 \u001b[32;22m+\r\n\u001b[39m \u001b[2m695 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175mtop\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНаверх\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m696 \u001b[32;22m+\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m697 \u001b[32;22m+\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m698 \u001b[32;22m+\u001b[38;2;205;214;244m\r\n\u001b[0m\u001b[48X\r\n\u001b[2m────────────────────────────────────────────────\r\n\r\n• \u001b[0mHTML собран. Проверяю технические вещи:\r\n повторяющиеся якоря, наличие целевых файлов и\r\n возможность напечатать PDF через headless\r\n Chromium.\r\n\r\n\u001b[32;1m•\u001b[0m \u001b[1mRan\u001b[0m \u001b[38;2;137;180;250mwhich\u001b[38;2;205;214;244m chromium\r\n\u001b[39;2m └ /usr/bin/chromium\r\n\r\n\u001b[31;1;22m•\u001b[0m \u001b[1mRan\u001b[0m \u001b[38;2;137;180;250mrtk\u001b[38;2;205;214;244m grep\u001b[38;2;147;153;178m -\u001b[38;2;235;160;172mo\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m\"id=\u001b[38;2;245;194;231m\\\"\u001b[38;2;166;227;161m[^\"\u001b[38;2;205;214;244m]+\u001b[38;2;245;194;231m\\\"\u001b[38;2;166;227;161m\" \"\u001b[38;2;205;214;244m90 Library/\r\n\u001b[39;2m │ \u001b[38;2;205;214;244;22mProgramming/Web/Подготовка к экзамену по\r\n\u001b[39;2m │ \u001b[38;2;205;214;244;22mвеб-разработке.html\u001b[38;2;166;227;161m\"\r\n\u001b[39;2m └ zsh:1: unmatched \"\r\n\r\n\u001b[32;1;22m•\u001b[0m \u001b[1mRan\u001b[0m \u001b[38;2;137;180;250mrtk\u001b[38;2;205;214;244m git diff\u001b[38;2;147;153;178m --\u001b[38;2;235;160;172mstat\r\n\u001b[39;2m └ .obsidian/workspace.json | 28 ++++++++++++\r\n\u001b[0m \u001b[2m++--------------\r\n\u001b[0m \u001b[2m 1 file changed, 14 insertions(+), 14\r\n\u001b[0m \u001b[2mdeletions(-)\r\n\r\n────────────────────────────────────────────────\r\n\r\n• \u001b[0mОдна проверочная команда сломалась на\r\n кавычках, без влияния на файлы. Повторяю её\r\n нормальной quoting-командой и сразу исправлю\r\n найденные дубли якорей, если будут.\r\n\r\n\u001b[32;1m•\u001b[0m \u001b[1mRan\u001b[0m \u001b[38;2;137;180;250mrtk\u001b[38;2;205;214;244m git status\u001b[38;2;147;153;178m --\u001b[38;2;235;160;172mshort\r\n\u001b[39;2m └ M .obsidian/workspace.json\r\n\u001b[0m \u001b[2m?? \"90 Library/Programming/Web/Подготовка к\r\n\u001b[0m \u001b[2mэкзамену по веб-разработке.html\"\r\n\r\n\u001b[31;1;22m•\u001b[0m \u001b[1mRan\u001b[0m \u001b[38;2;137;180;250mrtk\u001b[38;2;205;214;244m grep\u001b[38;2;147;153;178m -\u001b[38;2;235;160;172mo\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m'id=\"[^\"]+\"'\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m\"90 Library/\r\n\u001b[39;2m │ \u001b[38;2;166;227;161;22mProgramming/Web/Подготовка к экзамену по\r\n\u001b[39;2m │ \u001b[38;2;166;227;161;22mвеб-разработке.html\"\r\n\u001b[39;2m └ (no output)\r\n\r\n────────────────────────────────────────────────\r\n\r\n• \u001b[36;22mrg\u001b[0m с шаблоном для атрибутов не поймал HTML,\r\n поэтому проверю через более простые поиски по\r\n \u001b[36mid=\u001b[0m и ссылкам. Заодно вижу, что \u001b[36m.obsidian/\r\n\u001b[0m \u001b[36mworkspace.json\u001b[0m уже изменён вне моей задачи,\r\n его не трогаю.\r\n\r\n\u001b[31;1m•\u001b[0m \u001b[1mRan\u001b[0m \u001b[38;2;137;180;250mrtk\u001b[38;2;205;214;244m grep\u001b[38;2;147;153;178m -\u001b[38;2;235;160;172mn\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m\"href=\u001b[38;2;245;194;231m\\\"\u001b[38;2;166;227;161m#[^\"\u001b[38;2;205;214;244m]+\u001b[38;2;245;194;231m\\\"\u001b[38;2;166;227;161m\" \"\u001b[38;2;205;214;244m90 Library/\r\n\u001b[39;2m │ \u001b[38;2;205;214;244;22mProgramming/Web/Подготовка к экзамену по\r\n\u001b[39;2m │ \u001b[38;2;205;214;244;22mвеб-разработке.html\u001b[38;2;166;227;161m\"\r\n\u001b[39;2m └ zsh:1: unmatched \"\r\n\r\n\u001b[32;1;22m•\u001b[0m \u001b[1mRan\u001b[0m \u001b[38;2;137;180;250mrtk\u001b[38;2;205;214;244m grep\u001b[38;2;147;153;178m -\u001b[38;2;235;160;172mn\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m\"href=\u001b[38;2;245;194;231m\\\"\u001b[38;2;166;227;161m#s-meta\u001b[38;2;245;194;231m\\\"\u001b[38;2;166;227;161m|\r\n\u001b[39;2m │ \u001b[38;2;166;227;161;22mid=\u001b[38;2;245;194;231m\\\"\u001b[38;2;166;227;161ms-meta\u001b[38;2;245;194;231m\\\"\u001b[38;2;166;227;161m\"\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m\"90 Library/Programming/\r\n\u001b[39;2m │ \u001b[38;2;166;227;161;22mWeb/Подготовка к экзамену по\r\n\u001b[39;2m │ … +1 lines\r\n └ 4 matches in 3F:\r\n\r\n … +11 lines (ctrl + t to view transcript)\r\n\u001b[0m \u001b[2m 300: Class Meta\r\n\r\n\r\n\u001b[32;1;22m•\u001b[0m \u001b[1mRan\u001b[0m \u001b[38;2;137;180;250mrtk\u001b[38;2;205;214;244m grep\u001b[38;2;147;153;178m -\u001b[38;2;235;160;172mn\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m\"id=\"\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m\"90 Library/Programming/\r\n\u001b[39;2m │ \u001b[38;2;166;227;161;22mWeb/Подготовка к экзамену по\r\n\u001b[39;2m │ \u001b[38;2;166;227;161;22mвеб-разработке.html\"\r\n\u001b[39;2m └ 115 matches in 71F:\r\n\r\n … +237 lines (ctrl + t to view transcript)\r\n\r\n\u001b[0m \u001b[2m... +20\r\n\r\n────────────────────────────────────────────────\r\n\r\n• \u001b[0mНашёл реальный конфликт якоря \u001b[36ms-meta\u001b[0m: HTML\r\n meta-теги и Django \u001b[36mClass Meta\u001b[0m. Исправляю\r\n Django-якорь на отдельный \u001b[36ms-django-meta\u001b[0m.\r\n\r\n\u001b[2m• \u001b[1;22mEdited\u001b[0m 90 Library/Programming/Web/Подготовка к\r\nэкзамену по веб-разработке.html (\u001b[32m+2\u001b[0m \u001b[31m-2\u001b[0m)\r\n \u001b[2m299 \u001b[0m \u001b[38;2;205;214;244m \u001b[38;2;148;226;213m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mhref\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"#s-migrations\"\u001b[38;2;148;226;213m>\u001b[38;2;205;214;244mМиграци\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22mи\u001b[38;2;148;226;213m\r\n\u001b[39;48;5;52m \u001b[2m300 \u001b[31;22m-\u001b[38;2;205;214;244;2m \u001b[38;2;148;226;213m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mhref\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"#s-meta\"\u001b[38;2;148;226;213m>\u001b[38;2;205;214;244mClass Meta\u001b[38;2;148;226;213m\r\n\u001b[39;48;5;22;22m \u001b[2m300 \u001b[32;22m+\u001b[38;2;205;214;244m \u001b[38;2;148;226;213m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mhref\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"#s-django-meta\"\u001b[38;2;148;226;213m>\u001b[38;2;205;214;244mClass\u001b[1X\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mMeta\u001b[38;2;148;226;213m\r\n\u001b[0m \u001b[2m301 \u001b[0m \u001b[38;2;205;214;244m \u001b[38;2;148;226;213m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mhref\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"#s-null-blank\"\u001b[38;2;148;226;213m>\u001b[38;2;205;214;244mnull/bl\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22mank\u001b[38;2;148;226;213m\r\n\u001b[0m \u001b[2m ⋮\r\n\u001b[0m \u001b[2m471 \u001b[0m \u001b[38;2;205;214;244m \u001b[38;2;148;226;213m<\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mclass\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"card\"\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mid\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"s-migra\r\n\u001b[0m \u001b[2m \u001b[38;2;166;227;161;22mtions\"\u001b[38;2;148;226;213m><\u001b[38;2;137;180;250mh3\u001b[38;2;148;226;213m>\u001b[38;2;205;214;244mМиграции\u001b[38;2;148;226;213m<\u001b[38;2;137;180;250mp\u001b[38;2;148;226;213m>\u001b[38;2;205;214;244m`makemigrati\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22mons` создаёт файлы миграций из изменени\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22mй моделей, `migrate` применяет их к баз\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22mе данных.\u001b[38;2;148;226;213m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mclass\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"detail-link\"\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mhre\r\n\u001b[0m \u001b[2m \u001b[38;2;249;226;175;22mf\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"#d-django-models\"\u001b[38;2;148;226;213m>\u001b[38;2;205;214;244mПодробно: Django m\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22models\u001b[38;2;148;226;213m\r\n\u001b[39;48;5;52m \u001b[2m472 \u001b[31;22m-\u001b[38;2;205;214;244;2m \u001b[38;2;148;226;213m<\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mclass\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"card\"\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mid\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"s-meta\"\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22m уровне форм/валидации Django.\u001b[38;2;148;226;213m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mcl\r\n\u001b[0m \u001b[2m \u001b[38;2;249;226;175;22mass\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"detail-link\"\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mhref\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"#d-django-model\r\n\u001b[0m \u001b[2m \u001b[38;2;166;227;161;22ms\"\u001b[38;2;148;226;213m>\u001b[38;2;205;214;244mПодробно: Django models\u001b[38;2;148;226;213m\u001b[0m и\r\n \u001b[36m\u001b[0m. Браузер может воспринять их как\r\n разметку, поэтому экранирую такие примеры и\r\n пересоберу PDF.\r\n\r\n\u001b[32;1m•\u001b[0m \u001b[1mRan\u001b[0m \u001b[38;2;137;180;250mrtk\u001b[38;2;205;214;244m grep\u001b[38;2;147;153;178m -\u001b[38;2;235;160;172mn\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m\"<(doctype|html|head|body|\r\n\u001b[39;2m │ \u001b[38;2;166;227;161;22mtitle|meta|link|style|script|div|p|\r\n\u001b[39;2m │ \u001b[38;2;166;227;161;22msection|span|a |img|br|form|label|input|\r\n\u001b[39;2m │ … +5 lines\r\n └ 351 matches in 145F:\r\n\r\n … +460 lines (ctrl + t to view transcript)\r\n\r\n\u001b[0m \u001b[2m... +182\r\n\r\n────────────────────────────────────────────────\r\n\r\n• \u001b[0mЭкранировать нужно не весь файл, а только\r\n примеры тегов внутри учебного текста. Правлю\r\n эти строки вручную, чтобы не задеть настоящую\r\n HTML-разметку документа.\r\n\r\n\u001b[2m•\u001b[0m \u001b[1mExplored\r\n\u001b[22;2m └ \u001b[36;22mRead\u001b[0m Подготовка к экзамену по веб-\r\n разработке.html\r\n\r\n\u001b[2m• \u001b[1;22mEdited\u001b[0m 90 Library/Programming/Web/Подготовка к\r\nэкзамену по веб-разработке.html (\u001b[32m+6\u001b[0m \u001b[31m-6\u001b[0m)\r\n \u001b[2m400 \u001b[0m \u001b[38;2;205;214;244m \u001b[38;2;148;226;213m<\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mclass\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"cards\"\u001b[38;2;148;226;213m>\r\n\u001b[39;48;5;52m \u001b[2m401 \u001b[31;22m-\u001b[38;2;205;214;244;2m \u001b[38;2;148;226;213m<\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mclass\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"card\"\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mid\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"s-html-\r\n\u001b[39;22m \u001b[2m \u001b[38;2;166;227;161mstructure\"\u001b[38;2;148;226;213m><\u001b[38;2;137;180;250mh3\u001b[38;2;148;226;213m>\u001b[38;2;205;214;244mСтруктура документа\u001b[38;2;148;226;213m\r\n\u001b[39;22m \u001b[2m \u001b[38;2;148;226;213m<\u001b[38;2;137;180;250mp\u001b[38;2;148;226;213m>\u001b[38;2;205;214;244mHTML5-документ начинается с ``, затем `\u001b[38;2;148;226;213m<\u001b[38;2;137;180;250mhtml\u001b[38;2;148;226;213m>\u001b[38;2;205;214;244m`, внутри `\u001b[38;2;148;226;213m<\u001b[38;2;137;180;250mhea\r\n\u001b[39;22m \u001b[2m \u001b[38;2;137;180;250md\u001b[38;2;148;226;213m>\u001b[38;2;205;214;244m` с метаданными и `\u001b[38;2;148;226;213m<\u001b[38;2;137;180;250mbody\u001b[38;2;148;226;213m>\u001b[38;2;205;214;244m` с видимым\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244mсодержимым.\u001b[38;2;148;226;213m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mclass\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"detail-link\"\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mh\r\n\u001b[39;22m \u001b[2m \u001b[38;2;249;226;175mref\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"#d-html\"\u001b[38;2;148;226;213m>\u001b[38;2;205;214;244mПодробно: HTML\u001b[38;2;148;226;213m\r\n\u001b[39;22m \u001b[2m402 \u001b[31;22m-\u001b[38;2;205;214;244;2m \u001b[38;2;148;226;213m<\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mclass\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"card\"\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mid\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"s-html-\r\n\u001b[39;22m \u001b[2m \u001b[38;2;166;227;161mcomments\"\u001b[38;2;148;226;213m><\u001b[38;2;137;180;250mh3\u001b[38;2;148;226;213m>\u001b[38;2;205;214;244mКомментарии в HTML\u001b[38;2;148;226;213m<\u001b[38;2;137;180;250mp\r\n\u001b[39;22m \u001b[2m \u001b[38;2;148;226;213m>\u001b[38;2;205;214;244mКомментарий пишется как `\u001b[38;2;147;153;178m`. Браузер его не отображает, но он виден в исходном коде.

Подробно: HTML -

Теги внутри head

В `` обычно находятся ``, `<meta>`, `<link>`, `<style>`, `<script>` и технические данные страницы.</p><a class="detail-link" href="#d-html">Подробно: HTML</a></article> - <article class="card" id="s-meta"><h3>Мета-теги и viewport</h3><p>`<meta charset="utf-8">` задаёт кодировку. `viewport` нужен адаптивной вёрстке: `width=device-width, initial-scale=1.0`.</p><a class="detail-link" href="#d-html">Подробно: HTML</a></article> + <article class="card" id="s-html-structure"><h3>Структура документа</h3><p>HTML5-документ начинается с <code><!doctype html></code>, затем <code><html></code>, внутри <code><head></code> с метаданными и <code><body></code> с видимым содержимым.</p><a class="detail-link" href="#d-html">Подробно: HTML</a></article> + <article class="card" id="s-html-comments"><h3>Комментарии в HTML</h3><p>Комментарий пишется как <code><!-- текст --></code>. Браузер его не отображает, но он виден в исходном коде.</p><a class="detail-link" href="#d-html">Подробно: HTML</a></article> + <article class="card" id="s-head"><h3>Теги внутри head</h3><p>В <code><head></code> обычно находятся <code><title></code>, <code><meta></code>, <code><link></code>, <code><style></code>, <code><script></code> и технические данные страницы.</p><a class="detail-link" href="#d-html">Подробно: HTML</a></article> + <article class="card" id="s-meta"><h3>Мета-теги и viewport</h3><p><code><meta charset="utf-8"></code> задаёт кодировку. <code>viewport</code> нужен адаптивной вёрстке: <code>width=device-width, initial-scale=1.0</code>.</p><a class="detail-link" href="#d-html">Подробно: HTML</a></article> <article class="card" id="s-flow"><h3>Нормальный поток</h3><p>Нормальный поток — базовое расположение элементов без flex/grid/position: блочные идут сверху вниз, строчные текут внутри строки.</p><a class="detail-link" href="#d-html">Подробно: HTML</a></article> <article class="card" id="s-block-inline"><h3>Блочные и строчные элементы</h3><p>Блочные занимают доступную ширину и начинаются с новой строки: `div`, `p`, `section`. Строчные занимают место по содержимому: `span`, `a`, `strong`.</p><a class="detail-link" href="#d-html">Подробно: HTML</a></article> <article class="card" id="s-semantic"><h3>Семантические теги</h3><p>`header`, `nav`, `main`, `section`, `article`, `aside`, `footer` описывают смысл блоков. Это важно для доступности, SEO и читаемости кода.</p><a class="detail-link" href="#d-html">Подробно: HTML</a></article> @@ -409,8 +409,8 @@ <article class="card" id="s-class"><h3>Атрибут class</h3><p>`class` задаёт один или несколько CSS-классов. Один класс можно использовать на многих элементах.</p><a class="detail-link" href="#d-html">Подробно: HTML</a></article> <article class="card" id="s-id"><h3>Идентификатор элемента</h3><p>`id` должен быть уникален на странице. Используется для якорей, JS и CSS-селектора `#id`.</p><a class="detail-link" href="#d-html">Подробно: HTML</a></article> <article class="card" id="s-text-table"><h3>Заголовки, абзацы, списки, таблицы</h3><p>`h1-h6` задают структуру заголовков, `p` — абзац, `ul/ol/li` — списки, `table/tr/th/td` — табличные данные.</p><a class="detail-link" href="#d-html">Подробно: HTML</a></article> - <article class="card" id="s-img-link"><h3>Картинки и ссылки</h3><p>Ссылка: `<a href="...">`. Картинка: `<img src="..." alt="...">`; `alt` важен для доступности и случаев, когда изображение не загрузилось.</p><a class="detail-link" href="#d-html">Подробно: HTML</a></article> - <article class="card" id="s-whitespace"><h3>Переносы строк и пробелы</h3><p>В HTML последовательности пробелов схлопываются. Перенос строки в коде обычно не равен переносу на странице; для явного переноса есть `<br>`.</p><a class="detail-link" href="#d-html">Подробно: HTML</a></article> + <article class="card" id="s-img-link"><h3>Картинки и ссылки</h3><p>Ссылка: <code><a href="..."></code>. Картинка: <code><img src="..." alt="..."></code>; <code>alt</code> важен для доступности и случаев, когда изображение не загрузилось.</p><a class="detail-link" href="#d-html">Подробно: HTML</a></article> + <article class="card" id="s-whitespace"><h3>Переносы строк и пробелы</h3><p>В HTML последовательности пробелов схлопываются. Перенос строки в коде обычно не равен переносу на странице; для явного переноса есть <code><br></code>.</p><a class="detail-link" href="#d-html">Подробно: HTML</a></article> </div> </section> diff --git a/90 Library/Programming/Web/Подготовка к экзамену по веб-разработке.pdf b/90 Library/Programming/Web/Подготовка к экзамену по веб-разработке.pdf index 59a706e..48da143 100644 Binary files a/90 Library/Programming/Web/Подготовка к экзамену по веб-разработке.pdf and b/90 Library/Programming/Web/Подготовка к экзамену по веб-разработке.pdf differ diff --git a/90 Library/Programming/Web/Экзамен - Веб-ориентированные системы.md b/90 Library/Programming/Web/Экзамен - Веб-ориентированные системы.md index 01ef8d5..3820d8f 100644 --- a/90 Library/Programming/Web/Экзамен - Веб-ориентированные системы.md +++ b/90 Library/Programming/Web/Экзамен - Веб-ориентированные системы.md @@ -4,7 +4,7 @@ status: seed type: moc tags: [exam, web, django, html, css] created: 2026-06-01 -updated: 2026-06-01 +updated: 2026-06-04 source: "[[Экзамен.pdf]]" --- @@ -16,13 +16,13 @@ MOC по темам экзамена (программирование и сет | Блок | Темы | Ссылки | | :--- | :--- | :--- | -| **Сети и основы** | IPv4/v6, TCP, DNS, HTTP, OAuth 2.0 | [[IPv6]], [[TCP vs UDP]], [[DNS]] | +| **Сети и основы** | IPv4/v6, TCP, DNS, HTTP, OAuth 2.0 | [[IPv6]], [[TCP vs UDP]], [[DNS]], [[HTTP, HTTPS и HTTP3]], [[OAuth 2.0]] | | **Frontend** | HTML5, CSS Selectors, Flexbox, Grid | [[Основы HTML (структура, таблицы, формы)]], [[CSS: Адаптивность, Flexbox и Grid]] | | **Django (Backend)** | Models, ORM, FBV/CBV, Forms, URLs | [[Django: Модели и ORM]], [[Django: Представления, шаблоны и CBV]] | -## Недостающие темы -- OAuth 2.0 подробности. -- Протокол HTTP/3. -- Специфика CBV (Mixins). +## Файл подготовки + +- [[Подготовка к экзамену по веб-разработке.html]] +- [[Подготовка к экзамену по веб-разработке.pdf]] [[Programming - MOC]]