{ "main": { "id": "5324373015726ba8", "type": "split", "children": [ { "id": "4334af5869448aa1", "type": "tabs", "children": [ { "id": "28d74d490ab22900", "type": "leaf", "state": { "type": "markdown", "state": { "file": "90 Library/Programming/Web/CSS: Адаптивность, Flexbox и Grid.md", "mode": "source", "source": false, "backlinks": false }, "icon": "lucide-file", "title": "CSS: Адаптивность, Flexbox и Grid" } } ] } ], "direction": "vertical" }, "left": { "id": "a9c2d5e65288011a", "type": "split", "children": [ { "id": "383cca303cf4b57d", "type": "tabs", "children": [ { "id": "27e6486165131cfa", "type": "leaf", "state": { "type": "file-explorer", "state": { "sortOrder": "alphabetical", "autoReveal": true }, "icon": "lucide-folder-closed", "title": "Files" } }, { "id": "66079465678173e5", "type": "leaf", "state": { "type": "search", "state": { "query": "tag:#gym", "matchingCase": false, "explainSearch": false, "collapseAll": false, "extraContext": false, "sortOrder": "alphabetical" }, "icon": "lucide-search", "title": "Search" } }, { "id": "c2541ce190da912e", "type": "leaf", "state": { "type": "bookmarks", "state": {}, "icon": "lucide-bookmark", "title": "Bookmarks" } }, { "id": "673ce6e6c09cfc9c", "type": "leaf", "state": { "type": "tag", "state": { "sortOrder": "frequency", "useHierarchy": true, "showSearch": false, "searchQuery": "" }, "icon": "lucide-tags", "title": "Tags" } } ] } ], "direction": "horizontal", "width": 233 }, "right": { "id": "38c591aa0966839e", "type": "split", "children": [ { "id": "86a193b1d3159ff8", "type": "tabs", "children": [ { "id": "06940eb960fc1db5", "type": "leaf", "pinned": true, "state": { "type": "terminal:terminal", "state": { "terminal:terminal": { "cwd": "/home/ada/Documents/Vaults/SecondBrain", "focus": false, "profile": { "args": [ "--login" ], "executable": "/usr/bin/zsh", "followTheme": true, "name": "ZSH", "platforms": { "darwin": false, "linux": true }, "pythonExecutable": "python3", "restoreHistory": true, "rightClickAction": "copyPaste", "successExitCodes": [ "0", "SIGINT", "SIGTERM" ], "terminalOptions": { "fontFamily": "FiraCode Nerd Font Mono", "documentOverride": null }, "type": "integrated", "useWin32Conhost": false }, "profileSourceId": "7004edff-76db-412f-95d3-5fd8e180d055", "serial": { "columns": 32, "data": "\u001b[48;5;22m \u001b[2m \u001b[38;2;205;214;244;22m, обновить, удалить.\u001b[3X\r\n\u001b[0m \u001b[2m 22\r\n\u001b[48;5;52;22m \u001b[2m 20 \u001b[31;22m-\u001b[38;2;147;153;178;2m**\u001b[38;2;243;139;168;1mCUD (Create, Update,\u001b[1X\r\n\u001b[39;22;22m \u001b[2m \u001b[38;2;243;139;168;1mDelete)\u001b[38;2;147;153;178;22m**\u001b[38;2;205;214;244m — операции из\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244mменения данных. Django\u001b[1X\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244mпредоставляет мощную по\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244mдсистему форм для их ре\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244mализации.\u001b[14X\r\n\u001b[39;48;5;22;22m \u001b[2m 23 \u001b[32;22m+\u001b[38;2;205;214;244mФорма в Django — это сл\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mой между HTML-формой и\u001b[1X\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mPython-кодом. Она прини\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м и помогает сохранить\u001b[1X\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mрезультат.\u001b[13X\r\n\u001b[0m \u001b[2m 24\r\n\u001b[0m \u001b[2m 25 \u001b[0m \u001b[38;2;147;153;178m##\u001b[38;2;250;179;135m \u001b[38;2;148;226;213mТипы форм\r\n\u001b[39;48;5;52m \u001b[2m 23 \u001b[31;22m-\u001b[38;2;205;214;244;2m1\u001b[38;2;147;153;178m.\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m**`\u001b[38;2;243;139;168;1mforms.Form\u001b[38;2;147;153;178;22m`**\u001b[38;2;205;214;244m: Дл\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244mя общих задач (поиск, о\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244mбратная связь), не прив\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244mязанных к моделям.\u001b[5X\r\n\u001b[39;22m \u001b[2m 24 \u001b[31;22m-\u001b[38;2;205;214;244;2m2\u001b[38;2;147;153;178m.\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m**`\u001b[38;2;243;139;168;1mforms.ModelForm\u001b[38;2;147;153;178;22m`*\r\n\u001b[39;22m \u001b[2m \u001b[38;2;147;153;178m*\u001b[38;2;205;214;244m: Автоматическая генер\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244mация полей на основе мо\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244mдели.\u001b[18X\r\n\u001b[39;48;5;22;22m \u001b[2m 26 \u001b[32;22m+\u001b[38;2;147;153;178m-\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m**`\u001b[38;2;243;139;168;1mforms.Form\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ычная форма, не привяза\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и email.\u001b[15X\r\n\u001b[39m \u001b[2m 27 \u001b[32;22m+\u001b[38;2;147;153;178m-\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m**`\u001b[38;2;243;139;168;1mforms.ModelForm\u001b[38;2;147;153;178;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ли. Django сам создаёт\u001b[1X\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бъект через \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mform.save(\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 28 \u001b[32;22m+\r\n\u001b[39m \u001b[2m 29 \u001b[32;22m+\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;244mfo\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mrms.Form\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вать \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mforms.ModelForm\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m.\r\n\u001b[0m \u001b[2m 30\u001b[25X\r\n\u001b[0m \u001b[2m 31 \u001b[0m \u001b[38;2;147;153;178m```\u001b[38;2;205;214;244mpython\r\n\u001b[39;48;5;22m \u001b[2m 32 \u001b[32;22m+\u001b[38;2;203;166;247mfrom\u001b[38;2;205;214;244m django \u001b[38;2;203;166;247mimport\u001b[38;2;205;214;244m form\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22ms\r\n\u001b[39m \u001b[2m 33 \u001b[32;22m+\r\n\u001b[39m \u001b[2m 34 \u001b[32;22m+\u001b[38;2;203;166;247mfrom\u001b[38;2;205;214;244m \u001b[38;2;203;166;247m.\u001b[38;2;205;214;244mmodels \u001b[38;2;203;166;247mimport\u001b[38;2;205;214;244m Blo\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mg\r\n\u001b[39m \u001b[2m 35 \u001b[32;22m+\r\n\u001b[39m \u001b[2m 36 \u001b[32;22m+\r\n\u001b[0m \u001b[2m 37 \u001b[0m \u001b[38;2;203;166;247mclass\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mBlogForm\u001b[38;2;147;153;178m(\u001b[38;2;249;226;175mforms\u001b[38;2;148;226;213m.\u001b[38;2;249;226;175mMo\r\n\u001b[0m \u001b[2m \u001b[38;2;249;226;175;22mdelForm\u001b[38;2;147;153;178m):\r\n\u001b[0m \u001b[2m ⋮\r\n\u001b[0m \u001b[2m 39 \u001b[0m \u001b[38;2;166;227;161m model = Blog\r\n\u001b[39;48;5;52m \u001b[2m 30 \u001b[31;22m-\u001b[38;2;166;227;161;2m fields = ['name\r\n\u001b[39;22m \u001b[2m \u001b[38;2;166;227;161m', 'tagline']\r\n\u001b[39;48;5;22;22m \u001b[2m 40 \u001b[32;22m+\u001b[38;2;166;227;161m fields = [\"name\r\n\u001b[39m \u001b[2m \u001b[38;2;166;227;161;22m\", \"tagline\"]\r\n\u001b[0m \u001b[2m 41 \u001b[0m \u001b[38;2;166;227;161m widgets = {\u001b[4X\r\n\u001b[39;48;5;52m \u001b[2m 32 \u001b[31;22m-\u001b[38;2;166;227;161;2m 'name': for\r\n\u001b[39;22m \u001b[2m \u001b[38;2;166;227;161mms.TextInput(attrs={'cl\r\n\u001b[39;22m \u001b[2m \u001b[38;2;166;227;161mass': 'form-control'})\r\n\u001b[39;48;5;22;22m \u001b[2m 42 \u001b[32;22m+\u001b[38;2;166;227;161m \"name\": for\r\n\u001b[39m \u001b[2m \u001b[38;2;166;227;161;22mms.TextInput(attrs={\"cl\r\n\u001b[39m \u001b[2m \u001b[38;2;166;227;161;22mass\": \"form-control\"})\r\n\u001b[0m \u001b[2m 43 \u001b[0m \u001b[38;2;166;227;161m }\u001b[14X\r\n\u001b[0m \u001b[2m ⋮\r\n\u001b[0m \u001b[2m 48 \u001b[0m \u001b[38;2;147;153;178m##\u001b[38;2;250;179;135m \u001b[38;2;148;226;213mЖизненный цикл формы\r\n\u001b[0m \u001b[2m \u001b[38;2;148;226;213;22m в представлении\r\n\u001b[39;48;5;22m \u001b[2m 49 \u001b[32;22m+\u001b[38;2;205;214;244mОбычно view работает та\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mк:\r\n\u001b[39m \u001b[2m 50 \u001b[32;22m+\u001b[38;2;205;214;244m1\u001b[38;2;147;153;178m.\u001b[38;2;205;214;244m При \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mGET\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 51 \u001b[32;22m+\u001b[38;2;205;214;244m2\u001b[38;2;147;153;178m.\u001b[38;2;205;214;244m При \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mPOST\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;244mrequest.POST\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m.\r\n\u001b[39m \u001b[2m 52 \u001b[32;22m+\u001b[38;2;205;214;244m3\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;244mis_valid()\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m.\r\n\u001b[39m \u001b[2m 53 \u001b[32;22m+\u001b[38;2;205;214;244m4\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;244mredirect\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m.\r\n\u001b[39m \u001b[2m 54 \u001b[32;22m+\u001b[38;2;205;214;244m5\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 55 \u001b[32;22m+\r\n\u001b[0m \u001b[2m 56 \u001b[0m \u001b[38;2;147;153;178m```\u001b[38;2;205;214;244mpython\u001b[14X\r\n\u001b[39;48;5;22m \u001b[2m 57 \u001b[32;22m+\u001b[38;2;203;166;247mfrom\u001b[38;2;205;214;244m django\u001b[38;2;148;226;213m.\u001b[38;2;205;214;244mshortcuts \u001b[38;2;203;166;247mi\r\n\u001b[39m \u001b[2m \u001b[38;2;203;166;247;22mmport\u001b[38;2;205;214;244m redirect\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m render\r\n\u001b[39m \u001b[2m 58 \u001b[32;22m+\r\n\u001b[39m \u001b[2m 59 \u001b[32;22m+\r\n\u001b[0m \u001b[2m 60 \u001b[0m \u001b[38;2;203;166;247mdef\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mcontact_view\u001b[38;2;147;153;178m(\u001b[38;2;235;160;172mreques\r\n\u001b[0m \u001b[2m \u001b[38;2;235;160;172;22mt\u001b[38;2;147;153;178m):\r\n\u001b[0m \u001b[2m ⋮\r\n\u001b[0m \u001b[2m 62 \u001b[0m \u001b[38;2;166;227;161m form = ContactF\r\n\u001b[0m \u001b[2m \u001b[38;2;166;227;161;22morm(request.POST)\r\n\u001b[39;48;5;22m \u001b[2m 63 \u001b[32;22m+\u001b[23X\r\n\u001b[0m \u001b[2m 64 \u001b[0m \u001b[38;2;166;227;161m if form.is_vali\r\n\u001b[0m \u001b[2m \u001b[38;2;166;227;161;22md():\r\n\u001b[39;48;5;52m \u001b[2m 44 \u001b[31;22m-\u001b[38;2;166;227;161;2m # Данные оч\r\n\u001b[39;22m \u001b[2m \u001b[38;2;166;227;161mищены и доступны в form\r\n\u001b[39;22m \u001b[2m \u001b[38;2;166;227;161m.cleaned_data\r\n\u001b[0m \u001b[2m 65 \u001b[0m \u001b[38;2;166;227;161m data = form\r\n\u001b[0m \u001b[2m \u001b[38;2;166;227;161;22m.cleaned_data\r\n\u001b[39;48;5;52m \u001b[2m 46 \u001b[31;22m-\u001b[38;2;166;227;161;2m # Действие\u001b[1X\r\n\u001b[39;22m \u001b[2m \u001b[38;2;166;227;161m(сохранение или отправк\r\n\u001b[39;22m \u001b[2m \u001b[38;2;166;227;161mа email)\r\n\u001b[39;22m \u001b[2m 47 \u001b[31;22m-\u001b[38;2;166;227;161;2m return redi\r\n\u001b[39;22m \u001b[2m \u001b[38;2;166;227;161mrect('success')\r\n\u001b[39;48;5;22;22m \u001b[2m 66 \u001b[32;22m+\u001b[38;2;166;227;161m send_email(\r\n\u001b[39m \u001b[2m \u001b[38;2;166;227;161;22mdata[\"email\"], data[\"me\r\n\u001b[39m \u001b[2m \u001b[38;2;166;227;161;22mssage\"])\r\n\u001b[39m \u001b[2m 67 \u001b[32;22m+\u001b[38;2;166;227;161m return redi\r\n\u001b[39m \u001b[2m \u001b[38;2;166;227;161;22mrect(\"success\")\r\n\u001b[0m \u001b[2m 68 \u001b[0m \u001b[38;2;166;227;161m else:\u001b[14X\r\n\u001b[0m \u001b[2m 69 \u001b[0m \u001b[38;2;166;227;161m form = ContactF\r\n\u001b[0m \u001b[2m \u001b[38;2;166;227;161;22morm()\r\n\u001b[39;48;5;52m \u001b[2m 50 \u001b[31;22m-\u001b[38;2;166;227;161;2m return render(reque\r\n\u001b[39;22m \u001b[2m \u001b[38;2;166;227;161mst, 'contact.html', {'f\r\n\u001b[39;22m \u001b[2m \u001b[38;2;166;227;161morm': form})\r\n\u001b[39;48;5;22;22m \u001b[2m 70 \u001b[32;22m+\u001b[23X\r\n\u001b[39m \u001b[2m 71 \u001b[32;22m+\u001b[38;2;166;227;161m return render(reque\r\n\u001b[39m \u001b[2m \u001b[38;2;166;227;161;22mst, \"contact.html\", {\"f\r\n\u001b[39m \u001b[2m \u001b[38;2;166;227;161;22morm\": form})\r\n\u001b[0m \u001b[2m 72 \u001b[0m \u001b[38;2;147;153;178m```\u001b[20X\r\n\u001b[0m \u001b[2m ⋮\r\n\u001b[0m \u001b[2m 76 \u001b[0m \u001b[38;2;147;153;178m##\u001b[38;2;250;179;135m \u001b[38;2;148;226;213mВалидация и очистка\r\n\u001b[0m \u001b[2m \u001b[38;2;148;226;213;22mданных\r\n\u001b[39;48;5;52m \u001b[2m 56 \u001b[31;22m-\u001b[38;2;147;153;178;2m-\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m**`\u001b[38;2;243;139;168;1mis_valid()\u001b[38;2;147;153;178;22m`**\u001b[38;2;205;214;244m: Зап\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244mускает процесс проверки\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244m.\r\n\u001b[39;22m \u001b[2m 57 \u001b[31;22m-\u001b[38;2;147;153;178;2m-\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m**\u001b[38;2;243;139;168;1mАвтоматическая очис\r\n\u001b[39;22;22m \u001b[2m \u001b[38;2;243;139;168;1mтка\u001b[38;2;147;153;178;22m**\u001b[38;2;205;214;244m: Превращает текст\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244m в типы Python (наприме\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244mр, строку в \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mdatetime\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m)\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244m.\r\n\u001b[39;22m \u001b[2m 58 \u001b[31;22m-\u001b[38;2;147;153;178;2m-\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m**`\u001b[38;2;243;139;168;1mclean_(\r\n\u001b[39;22;22m \u001b[2m \u001b[38;2;243;139;168;1m)\u001b[38;2;147;153;178;22m`**\u001b[38;2;205;214;244m: Валидация конкрет\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244mного поля.\r\n\u001b[39;22m \u001b[2m 59 \u001b[31;22m-\u001b[38;2;147;153;178;2m-\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m**`\u001b[38;2;243;139;168;1mclean()\u001b[38;2;147;153;178;22m`**\u001b[38;2;205;214;244m: Валида\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244mция всей формы (сравнен\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244mие полей).\r\n\u001b[39;48;5;22;22m \u001b[2m 77 \u001b[32;22m+\u001b[38;2;147;153;178m-\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m**`\u001b[38;2;243;139;168;1mis_valid()\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пускает проверку формы.\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;244mform.cleaned_data\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;22mform.errors\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m.\r\n\u001b[39m \u001b[2m 78 \u001b[32;22m+\u001b[38;2;147;153;178m-\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m**\u001b[38;2;243;139;168;1mАвтоматическая очис\r\n\u001b[39;22m \u001b[2m \u001b[38;2;243;139;168;1;22mтка\u001b[38;2;147;153;178;22m**\u001b[38;2;205;214;244m — Django превраща\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mет строки из HTML-формы\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 \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mint\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m, дату в \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mdate\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m,\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22memail в строку после пр\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mоверки формата.\r\n\u001b[39m \u001b[2m 79 \u001b[32;22m+\u001b[38;2;147;153;178m-\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m**`\u001b[38;2;243;139;168;1mclean_(\r\n\u001b[39;22m \u001b[2m \u001b[38;2;243;139;168;1;22m)\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конкретного поля.\r\n\u001b[39m \u001b[2m 80 \u001b[32;22m+\u001b[38;2;147;153;178m-\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m**`\u001b[38;2;243;139;168;1mclean()\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рка всей формы, когда н\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 81 \u001b[32;22m+\r\n\u001b[39m \u001b[2m 82 \u001b[32;22m+\u001b[38;2;147;153;178m```\u001b[38;2;205;214;244mpython\r\n\u001b[39m \u001b[2m 83 \u001b[32;22m+\u001b[38;2;203;166;247mfrom\u001b[38;2;205;214;244m django \u001b[38;2;203;166;247mimport\u001b[38;2;205;214;244m form\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22ms\r\n\u001b[39m \u001b[2m 84 \u001b[32;22m+\r\n\u001b[39m \u001b[2m 85 \u001b[32;22m+\r\n\u001b[39m \u001b[2m 86 \u001b[32;22m+\u001b[38;2;203;166;247mclass\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mRegisterForm\u001b[38;2;147;153;178m(\u001b[38;2;249;226;175mform\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22ms\u001b[38;2;148;226;213m.\u001b[38;2;249;226;175mForm\u001b[38;2;147;153;178m):\r\n\u001b[39m \u001b[2m 87 \u001b[32;22m+\u001b[38;2;205;214;244m username \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mforms\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mCh\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22marField\u001b[38;2;147;153;178m(\u001b[38;2;235;160;172mmax_length\u001b[38;2;148;226;213m=\u001b[38;2;250;179;135m50\u001b[38;2;147;153;178m)\r\n\u001b[39m \u001b[2m 88 \u001b[32;22m+\u001b[38;2;205;214;244m password \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mforms\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mCh\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22marField\u001b[38;2;147;153;178m(\u001b[38;2;235;160;172mwidget\u001b[38;2;148;226;213m=\u001b[38;2;205;214;244mforms\u001b[38;2;148;226;213m.\u001b[38;2;205;214;244mPa\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22msswordInput\u001b[38;2;147;153;178m)\r\n\u001b[39m \u001b[2m 89 \u001b[32;22m+\u001b[38;2;205;214;244m password_repeat \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mf\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22morms\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mCharField\u001b[38;2;147;153;178m(\u001b[38;2;235;160;172mwidget\u001b[38;2;148;226;213m=\u001b[38;2;205;214;244mf\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22morms\u001b[38;2;148;226;213m.\u001b[38;2;205;214;244mPasswordInput\u001b[38;2;147;153;178m)\r\n\u001b[39m \u001b[2m 90 \u001b[32;22m+\r\n\u001b[39m \u001b[2m 91 \u001b[32;22m+\u001b[38;2;205;214;244m \u001b[38;2;203;166;247mdef\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mclean_username\u001b[38;2;147;153;178m(\r\n\u001b[39m \u001b[2m \u001b[38;2;235;160;172;22mself\u001b[38;2;147;153;178m):\r\n\u001b[39m \u001b[2m 92 \u001b[32;22m+\u001b[38;2;205;214;244m username \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;235;160;172mself\r\n\u001b[39m \u001b[2m \u001b[38;2;148;226;213;22m.\u001b[38;2;235;160;172mcleaned_data\u001b[38;2;147;153;178m[\u001b[38;2;166;227;161m\"username\r\n\u001b[39m \u001b[2m \u001b[38;2;166;227;161;22m\"\u001b[38;2;147;153;178m]\r\n\u001b[39m \u001b[2m 93 \u001b[32;22m+\r\n\u001b[39m \u001b[2m 94 \u001b[32;22m+\u001b[38;2;205;214;244m \u001b[38;2;203;166;247mif\u001b[38;2;205;214;244m \u001b[38;2;137;180;250musername\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mlow\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mer\u001b[38;2;147;153;178m()\u001b[38;2;205;214;244m \u001b[38;2;148;226;213m==\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m\"admin\"\u001b[38;2;147;153;178m:\r\n\u001b[39m \u001b[2m 95 \u001b[32;22m+\u001b[38;2;205;214;244m \u001b[38;2;203;166;247mraise\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mforms\r\n\u001b[39m \u001b[2m \u001b[38;2;148;226;213;22m.\u001b[38;2;137;180;250mValidationError\u001b[38;2;147;153;178m(\u001b[38;2;166;227;161m\"Это и\r\n\u001b[39m \u001b[2m \u001b[38;2;166;227;161;22mмя нельзя использовать\"\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m)\r\n\u001b[39m \u001b[2m 96 \u001b[32;22m+\r\n\u001b[39m \u001b[2m 97 \u001b[32;22m+\u001b[38;2;205;214;244m \u001b[38;2;203;166;247mreturn\u001b[38;2;205;214;244m username\r\n\u001b[39m \u001b[2m 98 \u001b[32;22m+\r\n\u001b[39m \u001b[2m 99 \u001b[32;22m+\u001b[38;2;205;214;244m \u001b[38;2;203;166;247mdef\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mclean\u001b[38;2;147;153;178m(\u001b[38;2;235;160;172mself\u001b[38;2;147;153;178m):\r\n\u001b[39m \u001b[2m100 \u001b[32;22m+\u001b[38;2;205;214;244m cleaned_data \u001b[38;2;148;226;213m=\r\n\u001b[39m \u001b[2m \u001b[38;2;250;179;135;22msuper\u001b[38;2;147;153;178m()\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mclean\u001b[38;2;147;153;178m()\r\n\u001b[39m \u001b[2m101 \u001b[32;22m+\u001b[38;2;205;214;244m password \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mclea\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mned_data\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mget\u001b[38;2;147;153;178m(\u001b[38;2;166;227;161m\"password\"\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m)\r\n\u001b[39m \u001b[2m102 \u001b[32;22m+\u001b[38;2;205;214;244m password_repeat\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mcleaned_data\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mget\u001b[38;2;147;153;178m(\u001b[38;2;166;227;161m\"pa\r\n\u001b[39m \u001b[2m \u001b[38;2;166;227;161;22mssword_repeat\"\u001b[38;2;147;153;178m)\r\n\u001b[39m \u001b[2m103 \u001b[32;22m+\r\n\u001b[39m \u001b[2m104 \u001b[32;22m+\u001b[38;2;205;214;244m \u001b[38;2;203;166;247mif\u001b[38;2;205;214;244m password \u001b[38;2;203;166;247mand\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m password_repeat \u001b[38;2;203;166;247mand\u001b[38;2;205;214;244m pa\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mssword \u001b[38;2;148;226;213m!=\u001b[38;2;205;214;244m password_repe\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mat\u001b[38;2;147;153;178m:\r\n\u001b[39m \u001b[2m105 \u001b[32;22m+\u001b[38;2;205;214;244m \u001b[38;2;203;166;247mraise\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mforms\r\n\u001b[39m \u001b[2m \u001b[38;2;148;226;213;22m.\u001b[38;2;137;180;250mValidationError\u001b[38;2;147;153;178m(\u001b[38;2;166;227;161m\"Парол\r\n\u001b[39m \u001b[2m \u001b[38;2;166;227;161;22mи не совпадают\"\u001b[38;2;147;153;178m)\r\n\u001b[39m \u001b[2m106 \u001b[32;22m+\r\n\u001b[39m \u001b[2m107 \u001b[32;22m+\u001b[38;2;205;214;244m \u001b[38;2;203;166;247mreturn\u001b[38;2;205;214;244m cleaned_\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mdata\r\n\u001b[39m \u001b[2m108 \u001b[32;22m+\u001b[38;2;147;153;178m```\r\n\u001b[0m \u001b[2m109\u001b[25X\r\n\u001b[0m \u001b[2m ⋮\r\n\u001b[0m \u001b[2m112 \u001b[0m \u001b[38;2;147;153;178m##\u001b[38;2;250;179;135m \u001b[38;2;148;226;213mGeneric Editing View\r\n\u001b[0m \u001b[2m \u001b[38;2;148;226;213;22ms (CBV для CUD)\r\n\u001b[39;48;5;52m \u001b[2m 64 \u001b[31;22m-\u001b[38;2;205;214;244;2mDjango предоставляет го\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244mтовые классы для CRUD:\r\n\u001b[39;22m \u001b[2m 65 \u001b[31;22m-\u001b[38;2;147;153;178;2m-\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m**\u001b[38;2;243;139;168;1mCreateView\u001b[38;2;147;153;178;22m**\u001b[38;2;205;214;244m: Созда\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244mние объекта.\r\n\u001b[39;22m \u001b[2m 66 \u001b[31;22m-\u001b[38;2;147;153;178;2m-\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m**\u001b[38;2;243;139;168;1mUpdateView\u001b[38;2;147;153;178;22m**\u001b[38;2;205;214;244m: Редак\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244mтирование (требует \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mpk\u001b[38;2;147;153;178m`\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244m в URL).\r\n\u001b[39;22m \u001b[2m 67 \u001b[31;22m-\u001b[38;2;147;153;178;2m-\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m**\u001b[38;2;243;139;168;1mDeleteView\u001b[38;2;147;153;178;22m**\u001b[38;2;205;214;244m: Удале\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244mние (требует подтвержде\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244mния через POST).\r\n\u001b[39;48;5;22;22m \u001b[2m113 \u001b[32;22m+\u001b[38;2;205;214;244mDjango предоставляет го\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[2m114 \u001b[32;22m+\u001b[38;2;147;153;178m-\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m**`\u001b[38;2;243;139;168;1mCreateView\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здать объект.\r\n\u001b[39m \u001b[2m115 \u001b[32;22m+\u001b[38;2;147;153;178m-\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m**`\u001b[38;2;243;139;168;1mUpdateView\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менить объект; обычно и\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mщет его по \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mpk\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m из URL.\r\n\u001b[39m \u001b[2m116 \u001b[32;22m+\u001b[38;2;147;153;178m-\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m**`\u001b[38;2;243;139;168;1mDeleteView\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алить объект; требует п\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mодтверждения через \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mPOS\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mT\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m.\r\n\u001b[39m \u001b[2m117 \u001b[32;22m+\r\n\u001b[39m \u001b[2m118 \u001b[32;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;244mGET\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;22mPOST\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m, \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mis_valid()\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;22msave()\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;22mURL после успеха.\r\n\u001b[0m \u001b[2m119\u001b[25X\r\n\u001b[48;5;52;22m \u001b[2m 69 \u001b[31;22m-\u001b[38;2;147;153;178;2m**\u001b[38;2;243;139;168;1mПример:\u001b[38;2;147;153;178;22m**\u001b[12X\r\n\u001b[0m \u001b[2m120 \u001b[0m \u001b[38;2;147;153;178m```\u001b[38;2;205;214;244mpython\u001b[14X\r\n\u001b[39;48;5;22m \u001b[2m121 \u001b[32;22m+\u001b[38;2;203;166;247mfrom\u001b[38;2;205;214;244m django\u001b[38;2;148;226;213m.\u001b[38;2;205;214;244murls \u001b[38;2;203;166;247mimport\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m reverse_lazy\r\n\u001b[39m \u001b[2m122 \u001b[32;22m+\u001b[38;2;203;166;247mfrom\u001b[38;2;205;214;244m django\u001b[38;2;148;226;213m.\u001b[38;2;205;214;244mviews\u001b[38;2;148;226;213m.\u001b[38;2;205;214;244mgener\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mic \u001b[38;2;203;166;247mimport\u001b[38;2;205;214;244m CreateView\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;22meleteView\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m UpdateView\r\n\u001b[39m \u001b[2m123 \u001b[32;22m+\r\n\u001b[39m \u001b[2m124 \u001b[32;22m+\u001b[38;2;203;166;247mfrom\u001b[38;2;205;214;244m \u001b[38;2;203;166;247m.\u001b[38;2;205;214;244mforms \u001b[38;2;203;166;247mimport\u001b[38;2;205;214;244m Blog\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mForm\r\n\u001b[39m \u001b[2m125 \u001b[32;22m+\u001b[38;2;203;166;247mfrom\u001b[38;2;205;214;244m \u001b[38;2;203;166;247m.\u001b[38;2;205;214;244mmodels \u001b[38;2;203;166;247mimport\u001b[38;2;205;214;244m Blo\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mg\r\n\u001b[39m \u001b[2m126 \u001b[32;22m+\r\n\u001b[39m \u001b[2m127 \u001b[32;22m+\r\n\u001b[0m \u001b[2m128 \u001b[0m \u001b[38;2;203;166;247mclass\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mBlogCreateView\u001b[38;2;147;153;178m(\u001b[38;2;249;226;175mCr\r\n\u001b[0m \u001b[2m \u001b[38;2;249;226;175;22meateView\u001b[38;2;147;153;178m):\r\n\u001b[0m \u001b[2m ⋮\r\n\u001b[0m \u001b[2m131 \u001b[0m \u001b[38;2;166;227;161m template_name = \"bl\r\n\u001b[0m \u001b[2m \u001b[38;2;166;227;161;22mog/blog_form.html\"\r\n\u001b[39;48;5;52m \u001b[2m 75 \u001b[31;22m-\u001b[38;2;166;227;161;2m success_url = rever\r\n\u001b[39;22m \u001b[2m \u001b[38;2;166;227;161mse_lazy('blog_list')\r\n\u001b[39;48;5;22;22m \u001b[2m132 \u001b[32;22m+\u001b[38;2;166;227;161m success_url = rever\r\n\u001b[39m \u001b[2m \u001b[38;2;166;227;161;22mse_lazy(\"blog_list\")\r\n\u001b[39m \u001b[2m133 \u001b[32;22m+\r\n\u001b[39m \u001b[2m134 \u001b[32;22m+\r\n\u001b[39m \u001b[2m135 \u001b[32;22m+\u001b[38;2;205;214;244mclass BlogUpdateView(Up\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mdateView):\r\n\u001b[39m \u001b[2m136 \u001b[32;22m+\u001b[38;2;205;214;244m model = Blog\r\n\u001b[39m \u001b[2m137 \u001b[32;22m+\u001b[38;2;205;214;244m form_class = BlogFo\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mrm\r\n\u001b[39m \u001b[2m138 \u001b[32;22m+\u001b[38;2;205;214;244m template_name = \"bl\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mog/blog_form.html\"\r\n\u001b[39m \u001b[2m139 \u001b[32;22m+\u001b[38;2;205;214;244m success_url = rever\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mse_lazy(\"blog_list\")\r\n\u001b[39m \u001b[2m140 \u001b[32;22m+\r\n\u001b[39m \u001b[2m141 \u001b[32;22m+\r\n\u001b[39m \u001b[2m142 \u001b[32;22m+\u001b[38;2;205;214;244mclass BlogDeleteView(De\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mleteView):\r\n\u001b[39m \u001b[2m143 \u001b[32;22m+\u001b[38;2;205;214;244m model = Blog\r\n\u001b[39m \u001b[2m144 \u001b[32;22m+\u001b[38;2;205;214;244m template_name = \"bl\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mog/blog_confirm_delete.\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhtml\"\r\n\u001b[39m \u001b[2m145 \u001b[32;22m+\u001b[38;2;205;214;244m success_url = rever\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mse_lazy(\"blog_list\")\r\n\u001b[0m \u001b[2m146 \u001b[0m \u001b[38;2;147;153;178m```\u001b[20X\r\n\u001b[0m \u001b[2m ⋮\r\n\u001b[0m \u001b[2m148 \u001b[0m \u001b[38;2;147;153;178m##\u001b[38;2;250;179;135m \u001b[38;2;148;226;213mОтображение в шаблон\r\n\u001b[0m \u001b[2m \u001b[38;2;148;226;213;22mе\r\n\u001b[39;48;5;52m \u001b[2m 79 \u001b[31;22m-\u001b[38;2;147;153;178;2m-\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m{{ form.as_p }}\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m — в\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244m параграфах.\r\n\u001b[39;22m \u001b[2m 80 \u001b[31;22m-\u001b[38;2;147;153;178;2m-\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m{{ form.as_table }}\u001b[38;2;147;153;178m`\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244m — в строках таблицы.\r\n\u001b[39;22m \u001b[2m 81 \u001b[31;22m-\u001b[38;2;147;153;178;2m-\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m**\u001b[38;2;243;139;168;1mРучное управление:\u001b[38;2;147;153;178;22m*\r\n\u001b[39;22m \u001b[2m \u001b[38;2;147;153;178m*\r\n\u001b[39;48;5;22;22m \u001b[2m149 \u001b[32;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{{ form.as_p }}\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

\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m.\r\n\u001b[39m \u001b[2m150 \u001b[32;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{{ form.as_table }}\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оки таблицы.\r\n\u001b[39m \u001b[2m151 \u001b[32;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но, когда важна HTML-ра\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mзметка, CSS-классы или\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mотдельный вывод ошибок.\r\n\u001b[39m \u001b[2m152 \u001b[32;22m+\r\n\u001b[39m \u001b[2m153 \u001b[32;22m+\u001b[38;2;147;153;178m```\u001b[38;2;205;214;244mhtml\r\n\u001b[39m \u001b[2m154 \u001b[32;22m+\u001b[38;2;205;214;244m

\r\n\u001b[39m \u001b[2m155 \u001b[32;22m+\u001b[38;2;205;214;244m {% csrf_token %}\r\n\u001b[39m \u001b[2m156 \u001b[32;22m+\u001b[38;2;205;214;244m {{ form.as_p }}\r\n\u001b[39m \u001b[2m157 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m158 \u001b[32;22m+\u001b[38;2;205;214;244m
\r\n\u001b[39m \u001b[2m159 \u001b[32;22m+\u001b[38;2;147;153;178m```\r\n\u001b[39m \u001b[2m160 \u001b[32;22m+\r\n\u001b[0m \u001b[2m161 \u001b[0m \u001b[38;2;147;153;178m```\u001b[38;2;205;214;244mhtml\u001b[16X\r\n\u001b[39;48;5;22m \u001b[2m162 \u001b[32;22m+\u001b[38;2;205;214;244m
\u001b[3X\r\n\u001b[39m \u001b[2m163 \u001b[32;22m+\u001b[38;2;205;214;244m {% csrf_token %}\r\n\u001b[39m \u001b[2m164 \u001b[32;22m+\r\n\u001b[0m \u001b[2m165 \u001b[0m \u001b[38;2;205;214;244m{% for field in form %}\r\n\u001b[39;48;5;52m \u001b[2m 84 \u001b[31;22m-\u001b[38;2;205;214;244;2m {{ field.label_tag }}\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244m {{ field }}\r\n\u001b[39;22m \u001b[2m 85 \u001b[31;22m-\u001b[38;2;205;214;244;2m {{ field.errors }}\r\n\u001b[39;48;5;22;22m \u001b[2m166 \u001b[32;22m+\u001b[38;2;205;214;244m
\u001b[14X\r\n\u001b[39m \u001b[2m167 \u001b[32;22m+\u001b[38;2;205;214;244m {{ field.label_ta\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mg }}\r\n\u001b[39m \u001b[2m168 \u001b[32;22m+\u001b[38;2;205;214;244m {{ field }}\r\n\u001b[39m \u001b[2m169 \u001b[32;22m+\u001b[38;2;205;214;244m {{ field.errors }\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m}\r\n\u001b[39m \u001b[2m170 \u001b[32;22m+\u001b[38;2;205;214;244m
\r\n\u001b[0m \u001b[2m171 \u001b[0m \u001b[38;2;205;214;244m{% endfor %}\u001b[11X\r\n\u001b[39;48;5;22m \u001b[2m172 \u001b[32;22m+\u001b[23X\r\n\u001b[39m \u001b[2m173 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m174 \u001b[32;22m+\u001b[38;2;205;214;244m
\r\n\u001b[0m \u001b[2m175 \u001b[0m \u001b[38;2;147;153;178m```\u001b[20X\r\n\u001b[39;48;5;52m \u001b[2m 88 \u001b[31;22m-\u001b[38;2;147;153;178;2m*\u001b[38;2;243;139;168mВажно:\u001b[38;2;147;153;178m*\u001b[38;2;205;214;244m Не забывайте п\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244mро \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m{% csrf_token %}\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m в\r\n\u001b[39;22m \u001b[2m \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[39;48;5;22;22m \u001b[2m176 \u001b[32;22m+\u001b[23X\r\n\u001b[39m \u001b[2m177 \u001b[32;22m+\u001b[38;2;147;153;178m###\u001b[38;2;249;226;175m \u001b[38;2;148;226;213mCSRF-токен\r\n\u001b[39m \u001b[2m178 \u001b[32;22m+\u001b[38;2;147;153;178m**\u001b[38;2;243;139;168;1mCSRF (Cross-Site Requ\r\n\u001b[39;22m \u001b[2m \u001b[38;2;243;139;168;1;22mest Forgery)\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 при которой чужой сайт\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[2m179 \u001b[32;22m+\r\n\u001b[39m \u001b[2m180 \u001b[32;22m+\u001b[38;2;205;214;244mПример: пользователь за\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mлогинен в Django-прилож\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аметно отправляет \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mPOST\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ъекта. Без защиты брауз\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mер приложит cookies пол\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[2m181 \u001b[32;22m+\r\n\u001b[39m \u001b[2m182 \u001b[32;22m+\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m{% csrf_token %}\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[2m183 \u001b[32;22m+\r\n\u001b[39m \u001b[2m184 \u001b[32;22m+\u001b[38;2;147;153;178m```\u001b[38;2;205;214;244mhtml\r\n\u001b[39m \u001b[2m185 \u001b[32;22m+\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m186 \u001b[32;22m+\u001b[38;2;147;153;178m```\r\n\u001b[39m \u001b[2m187 \u001b[32;22m+\r\n\u001b[39m \u001b[2m188 \u001b[32;22m+\u001b[38;2;205;214;244mПри \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mPOST\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m Django сверя\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[2m \u001b[38;2;205;214;244;22mяется.\r\n\u001b[39m \u001b[2m189 \u001b[32;22m+\r\n\u001b[39m \u001b[2m190 \u001b[32;22m+\u001b[38;2;205;214;244mКороткое правило: во вс\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mе HTML-формы с \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mmethod=\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\"post\"\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m добавлять \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m{% c\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22msrf_token %}\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m.\r\n\u001b[0m\u001b[32X\r\n\u001b[2m────────────────────────────────\r\n\r\n• \u001b[0mТекст внесён. Проверяю итог и\r\n обновляю индекс под новый\r\n \u001b[36mtitle\u001b[0m/\u001b[36mstatus\u001b[0m.\r\n\r\n\u001b[2m•\u001b[0m \u001b[1mExplored\r\n\u001b[22;2m └ \u001b[36;22mRead\u001b[0m Django: Работа с\r\n\u001b[2m \u001b[0mформами и\r\n CUD.md\u001b[2m, \u001b[0mINDEX.md\r\n\r\n\u001b[2m• \u001b[1;22mEdited\u001b[0m 99 System/INDEX.md (\u001b[32m+1\r\n\u001b[31m-2\u001b[0m)\r\n \u001b[2m525 \u001b[0m \u001b[38;2;205;214;244m| [[Django: Представлен\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22mия, шаблоны и CBV]] | D\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22mjango: Представления, ш\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22mаблоны и CBV | processi\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22mng | concept | [django,\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22m routing, templates, cb\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22mv, fbv] |\r\n\u001b[39;48;5;52m \u001b[2m526 \u001b[31;22m-\u001b[38;2;205;214;244;2m| [[Django: Работа с фо\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244mрмами и CUD]] | Django:\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244m Формы и CUD | seed | c\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244moncept | [django, forms\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244m, crud, validation, mod\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244melform] |\r\n\u001b[39;48;5;22;22m \u001b[2m526 \u001b[32;22m+\u001b[38;2;205;214;244m| [[Django: Работа с фо\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mрмами и CUD]] | Django:\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m Формы и CUD | processi\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mng | concept | [django,\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m forms, crud, validatio\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mn, modelform] |\r\n\u001b[0m \u001b[2m527 \u001b[0m \u001b[38;2;205;214;244m| [[Python - MOC]] | Py\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22mthon - MOC | seed | moc\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22m | [programming, python\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22m] |\r\n\u001b[0m \u001b[2m ⋮\r\n\u001b[0m \u001b[2m769 \u001b[0m \u001b[38;2;205;214;244m| [[Travel Item]] | — |\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22m seed | knowledge | [tr\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22mavel] |\r\n\u001b[39;48;5;52m \u001b[2m770 \u001b[31;22m-\u001b[23X\r\n\u001b[0m\u001b[32X\r\n\u001b[2m• \u001b[1;22mEdited\u001b[0m 90 Library/Programming/\r\nPython/Django: Работа с формами\r\nи CUD.md (\u001b[32m+2\u001b[0m \u001b[31m-2\u001b[0m)\r\n \u001b[2m164\r\n\u001b[48;5;52;22m \u001b[2m165 \u001b[31;22m-\u001b[38;2;205;214;244;2m{% for field in form %}\r\n\u001b[39;48;5;22;22m \u001b[2m165 \u001b[32;22m+\u001b[38;2;205;214;244m {% for field in form\u001b[1X\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m%}\r\n\u001b[0m \u001b[2m166 \u001b[0m \u001b[38;2;205;214;244m \u001b[38;2;148;226;213m<\u001b[38;2;137;180;250mdiv\u001b[38;2;148;226;213m>\u001b[14X\r\n\u001b[0m \u001b[2m ⋮\r\n\u001b[0m \u001b[2m170 \u001b[0m \u001b[38;2;166;227;161m \r\n\u001b[39;48;5;52m \u001b[2m171 \u001b[31;22m-\u001b[38;2;205;214;244;2m{% endfor %}\u001b[11X\r\n\u001b[39;48;5;22;22m \u001b[2m171 \u001b[32;22m+\u001b[38;2;205;214;244m {% endfor %}\u001b[9X\r\n\u001b[0m \u001b[2m172\u001b[25X\r\n\r\n•\u001b[0m \u001b[1mExplored\r\n\u001b[22;2m └ \u001b[36;22mRead\u001b[0m Django: Работа с\r\n\u001b[2m \u001b[0mформами и\r\n CUD.md\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 diff\u001b[38;2;147;153;178m --\u001b[38;2;235;160;172mstat\u001b[38;2;148;226;213m --\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m'90\r\n\u001b[39;2m │ \u001b[38;2;166;227;161;22mLibrary/Programming/\r\n\u001b[39;2m │ \u001b[38;2;166;227;161;22mPython/Django: Работа с\r\n\u001b[39;2m │ … +2 lines\r\n └ .../Python/Django: Работа с\r\n … +5 lines (ctrl + t to view\r\n transcript)\r\n\u001b[0m \u001b[2minsertions(+), 31\r\n\u001b[0m \u001b[2mdeletions(-)\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;172mcheck\u001b[38;2;148;226;213m --\r\n\u001b[39;2m │ \u001b[38;2;166;227;161;22m'90 Library/Programming/\r\n\u001b[39;2m │ \u001b[38;2;166;227;161;22mPython/Django: Работа с\r\n\u001b[39;2m │ … +2 lines\r\n └\r\n\r\n────────────────────────────────\r\n\r\n• \u001b[0mГотово.\r\n\r\n В \u001b[36m90 Library/Programming/\r\n\u001b[0m \u001b[36mPython/Django: Работа с\r\n\u001b[0m \u001b[36mформами и CUD.md:1\u001b[0m добавил\r\n простые пояснения про формы,\r\n \u001b[36mForm\u001b[0m/\u001b[36mModelForm\u001b[0m, жизненный цикл\r\n формы, валидацию, CBV для CUD\r\n и отображение в шаблоне.\r\n\r\n Отдельно добавил раздел \u001b[36mCSRF-\r\n\u001b[0m \u001b[36mтокен\u001b[0m: что это за атака, зачем\r\n нужен \u001b[36m{% csrf_token %}\u001b[0m, что он\r\n вставляет в HTML и когда его\r\n использовать. Статус заметки\r\n обновил на \u001b[36mprocessing\u001b[0m, индекс\r\n тоже поправил.\r\n\r\n\u001b[2m─ Worked for 2m 05s ────────────\r\n\r\n\u001b[48;5;238;22m\u001b[32X\r\n\u001b[1;2m› \u001b[22;22m\"90 Library/Programming/Web/\r\n Основы HTML (структура,\r\n таблицы, формы).md\" распиши\r\n немного про теги и семантику\r\n\r\n\u001b[0m\u001b[32X\r\n\u001b[2m• \u001b[0mПлан: прочитаю заметку и\r\n текущую структуру раздела Web,\r\n затем добавлю короткий блок\r\n про базовые теги и\r\n семантическую разметку без\r\n перестройки всей заметки.\r\n\r\n\u001b[2m•\u001b[0m \u001b[1mExplored\r\n\u001b[22;2m └ \u001b[36;22mRead\u001b[0m Основы HTML (структура,\r\n таблицы, формы).md\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\"Основы HTML|\r\n\u001b[39;2m │ \u001b[38;2;166;227;161;22mHTML\"\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m'99 System/INDEX.md'\r\n\u001b[39;2m │ \u001b[38;2;166;227;161;22m'90 Library/Programming/\r\n\u001b[39;2m │ … +1 lines\r\n └ 11 matches in 5F:\r\n … +32 lines (ctrl + t to\r\n view transcript)\r\n\u001b[0m \u001b[2m(структура, табли...\r\n\r\n\r\n────────────────────────────────\r\n\r\n• \u001b[0mВ заметке уже есть короткий\r\n раздел, но он больше\r\n перечисляет теги. Расширю его\r\n простыми пояснениями: что\r\n такое тег/атрибут, блочные и\r\n строчные элементы, зачем нужна\r\n семантика, и добавлю небольшой\r\n пример страницы.\r\n\r\n\u001b[2m• \u001b[1;22mEdited\u001b[0m 90 Library/Programming/\r\nWeb/Основы HTML (структура,\r\nтаблицы, формы).md (\u001b[32m+79\u001b[0m \u001b[31m-3\u001b[0m)\r\n \u001b[2m 1 \u001b[0m \u001b[38;2;147;153;178m---\r\n\u001b[39;48;5;52m \u001b[2m 2 \u001b[31;22m-\u001b[38;2;205;214;244;2mstatus: seed\u001b[11X\r\n\u001b[39;48;5;22;22m \u001b[2m 2 \u001b[32;22m+\u001b[38;2;205;214;244mstatus: processing\u001b[5X\r\n\u001b[0m \u001b[2m 3 \u001b[0m \u001b[38;2;205;214;244mtype: concept\u001b[10X\r\n\u001b[0m \u001b[2m ⋮\r\n\u001b[0m \u001b[2m 11 \u001b[0m \u001b[38;2;205;214;244mupdated: 2026-05-30\r\n\u001b[39;48;5;22m \u001b[2m 12 \u001b[32;22m+\u001b[38;2;205;214;244mtitle: \"Основы HTML (ст\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[0m \u001b[2m 13 \u001b[0m \u001b[38;2;205;214;244msource:\u001b[16X\r\n\u001b[0m \u001b[2m ⋮\r\n\u001b[0m \u001b[2m 49 \u001b[0m \u001b[38;2;147;153;178m##\u001b[38;2;250;179;135m \u001b[38;2;148;226;213mОсновные теги и сема\r\n\u001b[0m \u001b[2m \u001b[38;2;148;226;213;22mнтика\r\n\u001b[39;48;5;52m \u001b[2m 49 \u001b[31;22m-\u001b[38;2;205;214;244;2mHTML5 вводит семантичес\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244mкие теги для улучшения\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244mпонимания структуры пои\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244mсковиками и программами\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244m экранного доступа:\r\n\u001b[39;22m \u001b[2m 50 \u001b[31;22m-\u001b[38;2;147;153;178;2m-\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[38;2;147;153;178m`\u001b[38;2;205;214;244m