293 lines
114 KiB
JSON
293 lines
114 KiB
JSON
{
|
||
"main": {
|
||
"id": "5324373015726ba8",
|
||
"type": "split",
|
||
"children": [
|
||
{
|
||
"id": "4334af5869448aa1",
|
||
"type": "tabs",
|
||
"children": [
|
||
{
|
||
"id": "28d74d490ab22900",
|
||
"type": "leaf",
|
||
"state": {
|
||
"type": "markdown",
|
||
"state": {
|
||
"file": "90 Library/Programming/Web/Основы HTML (структура, таблицы, формы).md",
|
||
"mode": "preview",
|
||
"source": false,
|
||
"backlinks": false
|
||
},
|
||
"icon": "lucide-file",
|
||
"title": "Основы HTML (структура, таблицы, формы)"
|
||
}
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"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": 44,
|
||
"data": "\r\n\u001b[2m•\u001b[0m \u001b[1mExplored\r\n\u001b[22;2m └ \u001b[36;22mRead\u001b[0m Django: Модели и ORM.md\r\n\r\n\u001b[2m────────────────────────────────────────────\r\n\r\n• \u001b[0mДобавлю примеры там, где сейчас только\r\n списки: структура проекта получит\r\n минимальный \u001b[36mtree\u001b[0m, поля и отношения —\r\n пример моделей, миграции — команды, CRUD и\r\n lookups — ORM-запросы.\r\n\r\n\u001b[2m• \u001b[1;22mEdited\u001b[0m 90 Library/Programming/Python/\r\nDjango: Модели и ORM.md (\u001b[32m+72\u001b[0m \u001b[31m-0\u001b[0m)\r\n \u001b[2m 20\r\n\u001b[48;5;22;22m \u001b[2m 21 \u001b[32;22m+\u001b[38;2;147;153;178m```\u001b[38;2;205;214;244mtext\u001b[28X\r\n\u001b[39m \u001b[2m 22 \u001b[32;22m+\u001b[38;2;205;214;244mproject/\u001b[27X\r\n\u001b[39m \u001b[2m 23 \u001b[32;22m+\u001b[38;2;205;214;244m├── manage.py\u001b[22X\r\n\u001b[39m \u001b[2m 24 \u001b[32;22m+\u001b[38;2;205;214;244m├── project/\u001b[23X\r\n\u001b[39m \u001b[2m 25 \u001b[32;22m+\u001b[38;2;205;214;244m│ ├── settings.py\u001b[16X\r\n\u001b[39m \u001b[2m 26 \u001b[32;22m+\u001b[38;2;205;214;244m│ └── urls.py\u001b[20X\r\n\u001b[39m \u001b[2m 27 \u001b[32;22m+\u001b[38;2;205;214;244m└── app/\u001b[27X\r\n\u001b[39m \u001b[2m 28 \u001b[32;22m+\u001b[38;2;205;214;244m └── models.py\u001b[18X\r\n\u001b[39m \u001b[2m 29 \u001b[32;22m+\u001b[38;2;147;153;178m```\u001b[32X\r\n\u001b[39m \u001b[2m 30 \u001b[32;22m+\u001b[35X\r\n\u001b[0m \u001b[2m 31 \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 ⋮\r\n\u001b[0m \u001b[2m 57\r\n\u001b[48;5;22;22m \u001b[2m 58 \u001b[32;22m+\u001b[38;2;147;153;178m```\u001b[38;2;205;214;244mpython\u001b[26X\r\n\u001b[39m \u001b[2m 59 \u001b[32;22m+\u001b[38;2;203;166;247mclass\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mArticle\u001b[38;2;147;153;178m(\u001b[38;2;249;226;175mmodels\u001b[38;2;148;226;213m.\u001b[38;2;249;226;175mModel\u001b[38;2;147;153;178m):\u001b[7X\r\n\u001b[39m \u001b[2m 60 \u001b[32;22m+\u001b[38;2;205;214;244m \u001b[38;2;250;179;135mid\u001b[38;2;205;214;244m \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mmodels\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mAutoField\u001b[38;2;147;153;178m(\u001b[38;2;235;160;172mprimary_k\r\n\u001b[39m \u001b[2m \u001b[38;2;235;160;172;22mey\u001b[38;2;148;226;213m=\u001b[38;2;250;179;135mTrue\u001b[38;2;147;153;178m)\u001b[27X\r\n\u001b[39m \u001b[2m 61 \u001b[32;22m+\u001b[38;2;205;214;244m title \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mmodels\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mCharField\u001b[38;2;147;153;178m(\u001b[38;2;235;160;172mmax_le\r\n\u001b[39m \u001b[2m \u001b[38;2;235;160;172;22mngth\u001b[38;2;148;226;213m=\u001b[38;2;250;179;135m200\u001b[38;2;147;153;178m)\u001b[26X\r\n\u001b[39m \u001b[2m 62 \u001b[32;22m+\u001b[38;2;205;214;244m body \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mmodels\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mTextField\u001b[38;2;147;153;178m()\u001b[6X\r\n\u001b[39m \u001b[2m 63 \u001b[32;22m+\u001b[38;2;205;214;244m views \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mmodels\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mIntegerField\u001b[38;2;147;153;178m(\u001b[38;2;235;160;172mdef\r\n\u001b[39m \u001b[2m \u001b[38;2;235;160;172;22mault\u001b[38;2;148;226;213m=\u001b[38;2;250;179;135m0\u001b[38;2;147;153;178m)\r\n\u001b[39m \u001b[2m 64 \u001b[32;22m+\u001b[38;2;205;214;244m price \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mmodels\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mDecimalField\u001b[38;2;147;153;178m(\u001b[38;2;235;160;172mmax\r\n\u001b[39m \u001b[2m \u001b[38;2;235;160;172;22m_digits\u001b[38;2;148;226;213m=\u001b[38;2;250;179;135m10\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m \u001b[38;2;235;160;172mdecimal_places\u001b[38;2;148;226;213m=\u001b[38;2;250;179;135m2\u001b[38;2;147;153;178m)\r\n\u001b[39m \u001b[2m 65 \u001b[32;22m+\u001b[38;2;205;214;244m is_published \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mmodels\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mBooleanFi\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22meld\u001b[38;2;147;153;178m(\u001b[38;2;235;160;172mdefault\u001b[38;2;148;226;213m=\u001b[38;2;250;179;135mFalse\u001b[38;2;147;153;178m)\r\n\u001b[39m \u001b[2m 66 \u001b[32;22m+\u001b[38;2;205;214;244m published_at \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mmodels\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mDateTimeF\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mield\u001b[38;2;147;153;178m(\u001b[38;2;235;160;172mnull\u001b[38;2;148;226;213m=\u001b[38;2;250;179;135mTrue\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m \u001b[38;2;235;160;172mblank\u001b[38;2;148;226;213m=\u001b[38;2;250;179;135mTrue\u001b[38;2;147;153;178m)\r\n\u001b[39m \u001b[2m 67 \u001b[32;22m+\u001b[38;2;205;214;244m author_email \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mmodels\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mEmailFiel\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22md\u001b[38;2;147;153;178m()\r\n\u001b[39m \u001b[2m 68 \u001b[32;22m+\u001b[38;2;205;214;244m attachment \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mmodels\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mFileField\u001b[38;2;147;153;178m(\u001b[38;2;235;160;172mu\r\n\u001b[39m \u001b[2m \u001b[38;2;235;160;172;22mpload_to\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"files/\"\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m \u001b[38;2;235;160;172mblank\u001b[38;2;148;226;213m=\u001b[38;2;250;179;135mTrue\u001b[38;2;147;153;178m)\r\n\u001b[39m \u001b[2m 69 \u001b[32;22m+\u001b[38;2;205;214;244m cover \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mmodels\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mImageField\u001b[38;2;147;153;178m(\u001b[38;2;235;160;172muploa\r\n\u001b[39m \u001b[2m \u001b[38;2;235;160;172;22md_to\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"covers/\"\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m \u001b[38;2;235;160;172mblank\u001b[38;2;148;226;213m=\u001b[38;2;250;179;135mTrue\u001b[38;2;147;153;178m)\r\n\u001b[39m \u001b[2m 70 \u001b[32;22m+\u001b[38;2;147;153;178m```\r\n\u001b[39m \u001b[2m 71 \u001b[32;22m+\r\n\u001b[0m \u001b[2m 72 \u001b[0m \u001b[38;2;147;153;178m###\u001b[38;2;249;226;175m \u001b[38;2;148;226;213mОтношения\u001b[22X\r\n\u001b[0m \u001b[2m ⋮\r\n\u001b[0m \u001b[2m 83\r\n\u001b[48;5;22;22m \u001b[2m 84 \u001b[32;22m+\u001b[38;2;147;153;178m```\u001b[38;2;205;214;244mpython\u001b[26X\r\n\u001b[39m \u001b[2m 85 \u001b[32;22m+\u001b[38;2;203;166;247mclass\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mAuthor\u001b[38;2;147;153;178m(\u001b[38;2;249;226;175mmodels\u001b[38;2;148;226;213m.\u001b[38;2;249;226;175mModel\u001b[38;2;147;153;178m):\r\n\u001b[39m \u001b[2m 86 \u001b[32;22m+\u001b[38;2;205;214;244m name \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mmodels\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mCharField\u001b[38;2;147;153;178m(\u001b[38;2;235;160;172mmax_len\r\n\u001b[39m \u001b[2m \u001b[38;2;235;160;172;22mgth\u001b[38;2;148;226;213m=\u001b[38;2;250;179;135m100\u001b[38;2;147;153;178m)\r\n\u001b[39m \u001b[2m 87 \u001b[32;22m+\r\n\u001b[39m \u001b[2m 88 \u001b[32;22m+\r\n\u001b[39m \u001b[2m 89 \u001b[32;22m+\u001b[38;2;203;166;247mclass\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mProfile\u001b[38;2;147;153;178m(\u001b[38;2;249;226;175mmodels\u001b[38;2;148;226;213m.\u001b[38;2;249;226;175mModel\u001b[38;2;147;153;178m):\r\n\u001b[39m \u001b[2m 90 \u001b[32;22m+\u001b[38;2;205;214;244m author \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mmodels\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mOneToOneField\u001b[38;2;147;153;178m(\u001b[38;2;205;214;244mA\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22muthor\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m \u001b[38;2;235;160;172mon_delete\u001b[38;2;148;226;213m=\u001b[38;2;205;214;244mmodels\u001b[38;2;148;226;213m.\u001b[38;2;250;179;135mCASCADE\u001b[38;2;147;153;178m)\r\n\u001b[39m \u001b[2m 91 \u001b[32;22m+\u001b[38;2;205;214;244m bio \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mmodels\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mTextField\u001b[38;2;147;153;178m()\r\n\u001b[39m \u001b[2m 92 \u001b[32;22m+\r\n\u001b[39m \u001b[2m 93 \u001b[32;22m+\r\n\u001b[39m \u001b[2m 94 \u001b[32;22m+\u001b[38;2;203;166;247mclass\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mBook\u001b[38;2;147;153;178m(\u001b[38;2;249;226;175mmodels\u001b[38;2;148;226;213m.\u001b[38;2;249;226;175mModel\u001b[38;2;147;153;178m):\r\n\u001b[39m \u001b[2m 95 \u001b[32;22m+\u001b[38;2;205;214;244m title \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mmodels\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mCharField\u001b[38;2;147;153;178m(\u001b[38;2;235;160;172mmax_le\r\n\u001b[39m \u001b[2m \u001b[38;2;235;160;172;22mngth\u001b[38;2;148;226;213m=\u001b[38;2;250;179;135m200\u001b[38;2;147;153;178m)\r\n\u001b[39m \u001b[2m 96 \u001b[32;22m+\u001b[38;2;205;214;244m author \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mmodels\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mForeignKey\u001b[38;2;147;153;178m(\u001b[38;2;205;214;244mAuth\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mor\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m \u001b[38;2;235;160;172mon_delete\u001b[38;2;148;226;213m=\u001b[38;2;205;214;244mmodels\u001b[38;2;148;226;213m.\u001b[38;2;250;179;135mPROTECT\u001b[38;2;147;153;178m)\r\n\u001b[39m \u001b[2m 97 \u001b[32;22m+\u001b[38;2;205;214;244m co_authors \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mmodels\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mManyToManyF\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mield\u001b[38;2;147;153;178m(\u001b[38;2;205;214;244mAuthor\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m \u001b[38;2;235;160;172mrelated_name\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"coauthor\r\n\u001b[39m \u001b[2m \u001b[38;2;166;227;161;22med_books\"\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m \u001b[38;2;235;160;172mblank\u001b[38;2;148;226;213m=\u001b[38;2;250;179;135mTrue\u001b[38;2;147;153;178m)\r\n\u001b[39m \u001b[2m 98 \u001b[32;22m+\u001b[38;2;147;153;178m```\r\n\u001b[39m \u001b[2m 99 \u001b[32;22m+\r\n\u001b[0m \u001b[2m100 \u001b[0m \u001b[38;2;147;153;178m---\u001b[32X\r\n\u001b[0m \u001b[2m ⋮\r\n\u001b[0m \u001b[2m107\r\n\u001b[48;5;22;22m \u001b[2m108 \u001b[32;22m+\u001b[38;2;147;153;178m```\u001b[38;2;205;214;244mbash\u001b[28X\r\n\u001b[39m \u001b[2m109 \u001b[32;22m+\u001b[38;2;137;180;250mpython\u001b[38;2;205;214;244m manage.py makemigrations app\r\n\u001b[39m \u001b[2m110 \u001b[32;22m+\u001b[38;2;137;180;250mpython\u001b[38;2;205;214;244m manage.py migrate\r\n\u001b[39m \u001b[2m111 \u001b[32;22m+\u001b[38;2;137;180;250mpython\u001b[38;2;205;214;244m manage.py showmigrations app\r\n\u001b[39m \u001b[2m112 \u001b[32;22m+\u001b[38;2;147;153;178m```\r\n\u001b[39m \u001b[2m113 \u001b[32;22m+\r\n\u001b[0m \u001b[2m114 \u001b[0m \u001b[38;2;147;153;178m---\u001b[32X\r\n\u001b[0m \u001b[2m ⋮\r\n\u001b[0m \u001b[2m127\r\n\u001b[48;5;22;22m \u001b[2m128 \u001b[32;22m+\u001b[38;2;147;153;178m```\u001b[38;2;205;214;244mpython\u001b[26X\r\n\u001b[39m \u001b[2m129 \u001b[32;22m+\u001b[38;2;147;153;178m# Create\r\n\u001b[39m \u001b[2m130 \u001b[32;22m+\u001b[38;2;205;214;244mperson \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mPerson\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mobjects\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mcreate\u001b[38;2;147;153;178m(\u001b[38;2;235;160;172mfirs\r\n\u001b[39m \u001b[2m \u001b[38;2;235;160;172;22mt_name\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"Ivan\"\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m \u001b[38;2;235;160;172mage\u001b[38;2;148;226;213m=\u001b[38;2;250;179;135m25\u001b[38;2;147;153;178m)\r\n\u001b[39m \u001b[2m131 \u001b[32;22m+\r\n\u001b[39m \u001b[2m132 \u001b[32;22m+\u001b[38;2;147;153;178m# Read\r\n\u001b[39m \u001b[2m133 \u001b[32;22m+\u001b[38;2;205;214;244mpeople \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mPerson\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mobjects\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mall\u001b[38;2;147;153;178m()\r\n\u001b[39m \u001b[2m134 \u001b[32;22m+\u001b[38;2;205;214;244mperson \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mPerson\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mobjects\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mget\u001b[38;2;147;153;178m(\u001b[38;2;235;160;172mid\u001b[38;2;148;226;213m=\u001b[38;2;250;179;135m1\u001b[38;2;147;153;178m)\r\n\u001b[39m \u001b[2m135 \u001b[32;22m+\u001b[38;2;205;214;244madults \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mPerson\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mobjects\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mfilter\u001b[38;2;147;153;178m(\u001b[38;2;235;160;172mage_\r\n\u001b[39m \u001b[2m \u001b[38;2;235;160;172;22m_gte\u001b[38;2;148;226;213m=\u001b[38;2;250;179;135m18\u001b[38;2;147;153;178m)\r\n\u001b[39m \u001b[2m136 \u001b[32;22m+\r\n\u001b[39m \u001b[2m137 \u001b[32;22m+\u001b[38;2;147;153;178m# Update\r\n\u001b[39m \u001b[2m140 \u001b[32;22m+\u001b[38;2;147;153;178m# Delete\r\n\u001b[39m \u001b[2m141 \u001b[32;22m+\u001b[38;2;137;180;250mperson\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mdelete\u001b[38;2;147;153;178m()\r\n\u001b[39m \u001b[2m142 \u001b[32;22m+\u001b[38;2;147;153;178m```\r\n\u001b[39m \u001b[2m143 \u001b[32;22m+\r\n\u001b[0m \u001b[2m144 \u001b[0m \u001b[38;2;147;153;178m###\u001b[38;2;249;226;175m \u001b[38;2;148;226;213mПоиск по полям (Field Lookups)\u001b[1X\r\n\u001b[0m \u001b[2m ⋮\r\n\u001b[0m \u001b[2m150\r\n\u001b[48;5;22;22m \u001b[2m151 \u001b[32;22m+\u001b[38;2;147;153;178m```\u001b[38;2;205;214;244mpython\u001b[26X\r\n\u001b[39m \u001b[2m \u001b[38;2;235;160;172;22mexact\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"ivan\"\u001b[38;2;147;153;178m)\r\n\u001b[39m \u001b[2m154 \u001b[32;22m+\u001b[38;2;137;180;250mPerson\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mobjects\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mfilter\u001b[38;2;147;153;178m(\u001b[38;2;235;160;172mage__gt\u001b[38;2;148;226;213m=\u001b[38;2;250;179;135m18\u001b[38;2;147;153;178m)\r\n\u001b[39m \u001b[2m155 \u001b[32;22m+\u001b[38;2;137;180;250mPerson\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mobjects\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mfilter\u001b[38;2;147;153;178m(\u001b[38;2;235;160;172mage__range\u001b[38;2;148;226;213m=\u001b[38;2;147;153;178m(\u001b[38;2;250;179;135m1\r\n\u001b[39m \u001b[2m \u001b[38;2;250;179;135;22m8\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m \u001b[38;2;250;179;135m30\u001b[38;2;147;153;178m))\r\n\u001b[39m \u001b[2m156 \u001b[32;22m+\u001b[38;2;137;180;250mPerson\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mobjects\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mfilter\u001b[38;2;147;153;178m(\u001b[38;2;235;160;172mfirst_name__i\r\n\u001b[39m \u001b[2m \u001b[38;2;235;160;172;22mcontains\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"iv\"\u001b[38;2;147;153;178m)\r\n\u001b[39m \u001b[2m157 \u001b[32;22m+\u001b[38;2;137;180;250mPerson\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mobjects\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mfilter\u001b[38;2;147;153;178m(\u001b[38;2;235;160;172mid__in\u001b[38;2;148;226;213m=\u001b[38;2;147;153;178m[\u001b[38;2;250;179;135m1\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m \u001b[38;2;250;179;135m2\u001b[38;2;147;153;178m,\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m \u001b[38;2;250;179;135m3\u001b[38;2;147;153;178m])\r\n\u001b[39m \u001b[2m158 \u001b[32;22m+\u001b[38;2;137;180;250mPerson\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mobjects\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mfilter\u001b[38;2;147;153;178m(\u001b[38;2;235;160;172mbio__isnull\u001b[38;2;148;226;213m=\u001b[38;2;250;179;135mT\r\n\u001b[39m \u001b[2m \u001b[38;2;250;179;135;22mrue\u001b[38;2;147;153;178m)\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;249;226;175m \u001b[38;2;148;226;213mОптимизация запросов\u001b[11X\r\n\r\n\u001b[39;2m•\u001b[0m \u001b[1mExplored\r\n\u001b[22;2m └ \u001b[36;22mRead\u001b[0m Django: Модели и ORM.md\r\n\r\n\u001b[2m └ \u001b[36;22mRead\u001b[0m Django: Модели и ORM.md\r\n\r\n\u001b[2m────────────────────────────────────────────\r\n\r\n• \u001b[0mГотово.\r\n\r\n В \u001b[36m90 Library/Programming/Python/Django:\r\n\u001b[0m - типы полей;\r\n - отношения;\r\n - миграции;\r\n - CRUD;\r\n - field lookups.\r\n\r\n Проверил глазами итоговый Markdown.\r\n\r\n\u001b[2m────────────────────────────────────────────\r\n\r\n\u001b[48;5;238;22m\u001b[44X\r\n\u001b[1;2m› \u001b[22;22m\"90 Library/Programming/Python/Django:\r\n Представления, шаблоны и CBV.md\" давай\r\n сюда тоже добавим примеры и распишем\r\n непонятные моменты\r\n\r\n\u001b[0m\u001b[44X\r\n\u001b[2m• \u001b[0mПлан: сначала прочитаю заметку целиком и\r\n соседний стиль уже доработанной Django-\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 Django: Модели и ORM.md\u001b[2m, \u001b[0mDjango:\r\n Представления, шаблоны и CBV.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\"Django: Представления,\r\n\u001b[39;2m │ \u001b[38;2;166;227;161;22mшаблоны и CBV\"\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m'99 System/INDEX.md'\r\n\u001b[39;2m └ 1 matches in 1F:\r\n\r\n … +3 lines (ctrl + t to view transcript)\r\n\u001b[0m \u001b[2mseed | concept ...\r\n\r\n\r\n────────────────────────────────────────────\r\n\r\n• \u001b[0mВ заметке есть несостыковка: файл и индекс\r\n называются «Представления, шаблоны и CBV»,\r\n а \u001b[36mtitle\u001b[0m внутри заметки короче. Заодно\r\n приведу \u001b[36mtitle\u001b[0m и статус в порядок, потому\r\n что файл редактируется.\r\n\r\n\u001b[2m• \u001b[1;22mEdited\u001b[0m 90 Library/Programming/Python/\r\nDjango: Представления, шаблоны и CBV.md\r\n(\u001b[32m+155\u001b[0m \u001b[31m-4\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[23X\r\n\u001b[39;48;5;22;22m \u001b[2m 2 \u001b[32;22m+\u001b[38;2;205;214;244mstatus: processing\u001b[17X\r\n\u001b[0m \u001b[2m 3 \u001b[0m \u001b[38;2;205;214;244mtype: concept\u001b[22X\r\n\u001b[0m \u001b[2m ⋮\r\n\u001b[0m \u001b[2m 6 \u001b[0m \u001b[38;2;205;214;244mupdated: 2026-05-31\r\n\u001b[39;48;5;52m \u001b[2m 7 \u001b[31;22m-\u001b[38;2;205;214;244;2mtitle: \"Django: Представления и Шаб\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244mлоны\"\r\n\u001b[39;48;5;22;22m \u001b[2m 7 \u001b[32;22m+\u001b[38;2;205;214;244mtitle: \"Django: Представления, шабл\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mоны и CBV\"\r\n\u001b[0m \u001b[2m 8 \u001b[0m \u001b[38;2;205;214;244msource: [\"[[lec2-django_lec_urls_vi\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22mews_templates-1.pdf]]\", \"[[lec3-dja\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22mngo_cbv-1.pdf]]\", \"[[p4-django_cbv-\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22m1.pdf]]\"]\r\n\u001b[0m \u001b[2m ⋮\r\n\u001b[0m \u001b[2m 10\r\n\u001b[48;5;52;22m \u001b[2m 11 \u001b[31;22m-\u001b[38;2;147;153;178;2m#\u001b[38;2;243;139;168m \u001b[38;2;148;226;213mDjango: Представления и Шаблоны\u001b[2X\r\n\u001b[39;48;5;22;22m \u001b[2m 11 \u001b[32;22m+\u001b[38;2;147;153;178m#\u001b[38;2;243;139;168m \u001b[38;2;148;226;213mDjango: Представления, шаблоны и\u001b[1X\r\n\u001b[39m \u001b[2m \u001b[38;2;148;226;213;22mCBV\r\n\u001b[0m \u001b[2m 12\u001b[37X\r\n\u001b[0m \u001b[2m ⋮\r\n\u001b[0m \u001b[2m 18\r\n\u001b[48;5;22;22m \u001b[2m 19 \u001b[32;22m+\u001b[38;2;205;214;244mМаршрутизация связывает URL с view-\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mфункцией или 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;244mname\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 в коде и шаблонах.\r\n\u001b[39m \u001b[2m 20 \u001b[32;22m+\r\n\u001b[39m \u001b[2m 21 \u001b[32;22m+\u001b[38;2;147;153;178m```\u001b[38;2;205;214;244mpython\r\n\u001b[39m \u001b[2m 22 \u001b[32;22m+\u001b[38;2;147;153;178m# project/urls.py\r\n\u001b[39m \u001b[2m 23 \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\u001b[38;2;205;214;244m include\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m pa\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mth\r\n\u001b[39m \u001b[2m 24 \u001b[32;22m+\r\n\u001b[39m \u001b[2m 25 \u001b[32;22m+\u001b[38;2;205;214;244murlpatterns \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m[\r\n\u001b[39m \u001b[2m 26 \u001b[32;22m+\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mpath\u001b[38;2;147;153;178m(\u001b[38;2;166;227;161m\"blog/\"\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m \u001b[38;2;137;180;250minclude\u001b[38;2;147;153;178m(\u001b[38;2;166;227;161m\"blog.url\r\n\u001b[39m \u001b[2m \u001b[38;2;166;227;161;22ms\"\u001b[38;2;147;153;178m)),\r\n\u001b[39m \u001b[2m 27 \u001b[32;22m+\u001b[38;2;147;153;178m]\r\n\u001b[39m \u001b[2m 28 \u001b[32;22m+\u001b[38;2;147;153;178m```\r\n\u001b[39m \u001b[2m 29 \u001b[32;22m+\r\n\u001b[39m \u001b[2m 30 \u001b[32;22m+\u001b[38;2;147;153;178m```\u001b[38;2;205;214;244mpython\r\n\u001b[39m \u001b[2m 31 \u001b[32;22m+\u001b[38;2;147;153;178m# blog/urls.py\r\n\u001b[39m \u001b[2m 32 \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\u001b[38;2;205;214;244m path\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;244m \u001b[38;2;203;166;247mimport\u001b[38;2;205;214;244m views\r\n\u001b[39m \u001b[2m 35 \u001b[32;22m+\r\n\u001b[39m \u001b[2m 36 \u001b[32;22m+\u001b[38;2;205;214;244mapp_name \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m\"blog\"\r\n\u001b[39m \u001b[2m 37 \u001b[32;22m+\r\n\u001b[39m \u001b[2m 38 \u001b[32;22m+\u001b[38;2;205;214;244murlpatterns \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m[\r\n\u001b[39m \u001b[2m 39 \u001b[32;22m+\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mpath\u001b[38;2;147;153;178m(\u001b[38;2;166;227;161m\"\"\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m views\u001b[38;2;148;226;213m.\u001b[38;2;205;214;244mpost_list\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m \u001b[38;2;235;160;172mname\u001b[38;2;148;226;213m=\r\n\u001b[39m \u001b[2m \u001b[38;2;166;227;161;22m\"post_list\"\u001b[38;2;147;153;178m),\r\n\u001b[39m \u001b[2m 40 \u001b[32;22m+\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mpath\u001b[38;2;147;153;178m(\u001b[38;2;166;227;161m\"<int:pk>/\"\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m views\u001b[38;2;148;226;213m.\u001b[38;2;205;214;244mpost_de\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mtail\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m \u001b[38;2;235;160;172mname\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"post_detail\"\u001b[38;2;147;153;178m),\r\n\u001b[39m \u001b[2m 41 \u001b[32;22m+\u001b[38;2;147;153;178m]\r\n\u001b[39m \u001b[2m 42 \u001b[32;22m+\u001b[38;2;147;153;178m```\r\n\u001b[39m \u001b[2m 43 \u001b[32;22m+\r\n\u001b[39m \u001b[2m 44 \u001b[32;22m+\u001b[38;2;147;153;178m```\u001b[38;2;205;214;244mpython\r\n\u001b[39m \u001b[2m 45 \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\u001b[38;2;205;214;244m reverse\r\n\u001b[39m \u001b[2m 46 \u001b[32;22m+\r\n\u001b[39m \u001b[2m 47 \u001b[32;22m+\u001b[38;2;205;214;244murl \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mreverse\u001b[38;2;147;153;178m(\u001b[38;2;166;227;161m\"blog:post_detail\"\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m \u001b[38;2;235;160;172mk\r\n\u001b[39m \u001b[2m \u001b[38;2;235;160;172;22mwargs\u001b[38;2;148;226;213m=\u001b[38;2;147;153;178m{\u001b[38;2;166;227;161m\"pk\"\u001b[38;2;147;153;178m:\u001b[38;2;205;214;244m \u001b[38;2;250;179;135m1\u001b[38;2;147;153;178m})\r\n\u001b[39m \u001b[2m 48 \u001b[32;22m+\u001b[38;2;147;153;178m```\r\n\u001b[39m \u001b[2m 49 \u001b[32;22m+\r\n\u001b[0m \u001b[2m 50 \u001b[0m \u001b[38;2;147;153;178m---\u001b[32X\r\n\u001b[0m \u001b[2m ⋮\r\n\u001b[0m \u001b[2m 52 \u001b[0m \u001b[38;2;147;153;178m##\u001b[38;2;250;179;135m \u001b[38;2;148;226;213mПредставления (Views)\r\n\u001b[39;48;5;52m \u001b[2m 22 \u001b[31;22m-\u001b[38;2;205;214;244;2m Views принимают `HttpRequest` и во\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244mзвращают `HttpResponse`.\r\n\u001b[39;48;5;22;22m \u001b[2m 53 \u001b[32;22m+\u001b[38;2;205;214;244mViews принимают \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mHttpRequest\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;244mHttpResponse\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m.\r\n\u001b[39m \u001b[2m 54 \u001b[32;22m+\r\n\u001b[39m \u001b[2m 55 \u001b[32;22m+\u001b[38;2;205;214;244mView — это точка входа для запроса.\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проверяют условия и возвращают HTML\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m, JSON, редирект или ошибку.\r\n\u001b[0m \u001b[2m 56\u001b[37X\r\n\u001b[0m \u001b[2m 57 \u001b[0m \u001b[38;2;147;153;178m###\u001b[38;2;249;226;175m \u001b[38;2;148;226;213mФункциональные представления (F\r\n\u001b[0m \u001b[2m \u001b[38;2;148;226;213;22mBV)\r\n\u001b[39;48;5;22m \u001b[2m 58 \u001b[32;22m+\u001b[38;2;205;214;244mFBV — обычная функция. Удобна, когд\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mа логика короткая и нестандартная.\r\n\u001b[39m \u001b[2m 59 \u001b[32;22m+\r\n\u001b[0m \u001b[2m 60 \u001b[0m \u001b[38;2;147;153;178m```\u001b[38;2;205;214;244mpython\u001b[26X\r\n\u001b[0m \u001b[2m ⋮\r\n\u001b[0m \u001b[2m 67\r\n\u001b[48;5;22;22m \u001b[2m 68 \u001b[32;22m+\u001b[38;2;147;153;178m```\u001b[38;2;205;214;244mpython\u001b[26X\r\n\u001b[39m \u001b[2m 69 \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;247mimport\u001b[38;2;205;214;244m get_ob\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mject_or_404\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m render\r\n\u001b[39m \u001b[2m 70 \u001b[32;22m+\r\n\u001b[39m \u001b[2m 71 \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 Post\r\n\u001b[39m \u001b[2m 72 \u001b[32;22m+\r\n\u001b[39m \u001b[2m 73 \u001b[32;22m+\u001b[38;2;203;166;247mdef\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mpost_detail\u001b[38;2;147;153;178m(\u001b[38;2;235;160;172mrequest\u001b[38;2;147;153;178m,\u001b[38;2;235;160;172m pk\u001b[38;2;147;153;178m):\r\n\u001b[39m \u001b[2m 74 \u001b[32;22m+\u001b[38;2;205;214;244m post \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mget_object_or_404\u001b[38;2;147;153;178m(\u001b[38;2;205;214;244mPost\u001b[38;2;147;153;178m,\r\n\u001b[39m \u001b[2m \u001b[38;2;235;160;172;22mpk\u001b[38;2;148;226;213m=\u001b[38;2;205;214;244mpk\u001b[38;2;147;153;178m)\r\n\u001b[39m \u001b[2m 75 \u001b[32;22m+\u001b[38;2;205;214;244m \u001b[38;2;203;166;247mreturn\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mrender\u001b[38;2;147;153;178m(\u001b[38;2;205;214;244mrequest\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m\"blog/de\r\n\u001b[39m \u001b[2m \u001b[38;2;166;227;161;22mtail.html\"\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m{\u001b[38;2;166;227;161m\"post\"\u001b[38;2;147;153;178m:\u001b[38;2;205;214;244m post\u001b[38;2;147;153;178m})\r\n\u001b[39m \u001b[2m 76 \u001b[32;22m+\u001b[38;2;147;153;178m```\r\n\u001b[39m \u001b[2m 77 \u001b[32;22m+\r\n\u001b[0m \u001b[2m 78 \u001b[0m \u001b[38;2;147;153;178m###\u001b[38;2;249;226;175m \u001b[38;2;148;226;213mКлассовые представления (CBV)\u001b[2X\r\n\u001b[0m \u001b[2m ⋮\r\n\u001b[0m \u001b[2m 84\r\n\u001b[48;5;22;22m \u001b[2m 85 \u001b[32;22m+\u001b[38;2;205;214;244mCBV — класс с готовым поведением. D\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mjango сам вызывает нужные методы кл\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 для GET-зап\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_queryset()\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 86 \u001b[32;22m+\r\n\u001b[0m \u001b[2m 87 \u001b[0m \u001b[38;2;147;153;178m**\u001b[38;2;243;139;168;1mПример ListView:\u001b[38;2;147;153;178;22m**\u001b[15X\r\n\u001b[0m \u001b[2m 88 \u001b[0m \u001b[38;2;147;153;178m```\u001b[38;2;205;214;244mpython\r\n\u001b[39;48;5;22m \u001b[2m 89 \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;244mgeneric \u001b[38;2;203;166;247mimport\u001b[38;2;205;214;244m De\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mtailView\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m ListView\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m TemplateView\r\n\u001b[39m \u001b[2m 90 \u001b[32;22m+\r\n\u001b[39m \u001b[2m 91 \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 Post\r\n\u001b[39m \u001b[2m 92 \u001b[32;22m+\r\n\u001b[39m \u001b[2m 93 \u001b[32;22m+\r\n\u001b[39m \u001b[2m 94 \u001b[32;22m+\u001b[38;2;203;166;247mclass\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mAboutView\u001b[38;2;147;153;178m(\u001b[38;2;249;226;175mTemplateView\u001b[38;2;147;153;178m):\r\n\u001b[39m \u001b[2m 95 \u001b[32;22m+\u001b[38;2;205;214;244m template_name \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m\"blog/about.htm\r\n\u001b[39m \u001b[2m \u001b[38;2;166;227;161;22ml\"\r\n\u001b[39m \u001b[2m 96 \u001b[32;22m+\r\n\u001b[39m \u001b[2m 97 \u001b[32;22m+\r\n\u001b[0m \u001b[2m 98 \u001b[0m \u001b[38;2;203;166;247mclass\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mPostListView\u001b[38;2;147;153;178m(\u001b[38;2;249;226;175mListView\u001b[38;2;147;153;178m):\u001b[6X\r\n\u001b[0m \u001b[2m ⋮\r\n\u001b[0m \u001b[2m102 \u001b[0m \u001b[38;2;166;227;161m paginate_by = 10\r\n\u001b[39;48;5;22m \u001b[2m103 \u001b[32;22m+\u001b[35X\r\n\u001b[39m \u001b[2m104 \u001b[32;22m+\u001b[38;2;166;227;161m def get_queryset(self):\r\n\u001b[39m \u001b[2m105 \u001b[32;22m+\u001b[38;2;166;227;161m return Post.objects.filter(\r\n\u001b[39m \u001b[2m \u001b[38;2;166;227;161;22mis_published=True).order_by(\"-creat\r\n\u001b[39m \u001b[2m \u001b[38;2;166;227;161;22med_at\")\r\n\u001b[39m \u001b[2m106 \u001b[32;22m+\r\n\u001b[39m \u001b[2m107 \u001b[32;22m+\r\n\u001b[39m \u001b[2m108 \u001b[32;22m+\u001b[38;2;205;214;244mclass PostDetailView(DetailView):\r\n\u001b[39m \u001b[2m109 \u001b[32;22m+\u001b[38;2;205;214;244m model = Post\r\n\u001b[39m \u001b[2m110 \u001b[32;22m+\u001b[38;2;205;214;244m template_name = \"blog/detail.ht\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mml\"\r\n\u001b[39m \u001b[2m111 \u001b[32;22m+\u001b[38;2;205;214;244m context_object_name = \"post\"\r\n\u001b[0m \u001b[2m112 \u001b[0m \u001b[38;2;147;153;178m```\u001b[32X\r\n\u001b[0m \u001b[2m113\r\n\u001b[48;5;22;22m \u001b[2m114 \u001b[32;22m+\u001b[38;2;205;214;244m```python\u001b[26X\r\n\u001b[39m \u001b[2m115 \u001b[32;22m+\u001b[38;2;205;214;244m# blog/urls.py\r\n\u001b[39m \u001b[2m116 \u001b[32;22m+\u001b[38;2;205;214;244mfrom django.urls import path\r\n\u001b[39m \u001b[2m117 \u001b[32;22m+\r\n\u001b[39m \u001b[2m118 \u001b[32;22m+\u001b[38;2;205;214;244mfrom .views import AboutView, PostD\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22metailView, PostListView\r\n\u001b[39m \u001b[2m119 \u001b[32;22m+\r\n\u001b[39m \u001b[2m120 \u001b[32;22m+\u001b[38;2;205;214;244mapp_name = \"blog\"\r\n\u001b[39m \u001b[2m121 \u001b[32;22m+\r\n\u001b[39m \u001b[2m122 \u001b[32;22m+\u001b[38;2;205;214;244murlpatterns = [\r\n\u001b[39m \u001b[2m123 \u001b[32;22m+\u001b[38;2;205;214;244m path(\"about/\", AboutView.as_vie\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mw(), name=\"about\"),\r\n\u001b[39m \u001b[2m124 \u001b[32;22m+\u001b[38;2;205;214;244m path(\"\", PostListView.as_view()\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m, name=\"post_list\"),\r\n\u001b[39m \u001b[2m125 \u001b[32;22m+\u001b[38;2;205;214;244m path(\"<int:pk>/\", PostDetailVie\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mw.as_view(), name=\"post_detail\"),\r\n\u001b[39m \u001b[2m126 \u001b[32;22m+\u001b[38;2;205;214;244m]\r\n\u001b[39m \u001b[2m127 \u001b[32;22m+\u001b[38;2;147;153;178m```\r\n\u001b[39m \u001b[2m128 \u001b[32;22m+\r\n\u001b[0m \u001b[2m129 \u001b[0m \u001b[38;2;147;153;178m---\u001b[32X\r\n\u001b[0m \u001b[2m ⋮\r\n\u001b[0m \u001b[2m138\r\n\u001b[48;5;22;22m \u001b[2m139 \u001b[32;22m+\u001b[38;2;205;214;244mШаблон получает контекст из view. Н\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{\"post\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22ms\": posts}\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;244mposts\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m.\r\n\u001b[39m \u001b[2m140 \u001b[32;22m+\r\n\u001b[39m \u001b[2m141 \u001b[32;22m+\u001b[38;2;147;153;178m```\u001b[38;2;205;214;244mhtml\r\n\u001b[39m \u001b[2m142 \u001b[32;22m+\u001b[38;2;205;214;244m{% for post in posts %}\r\n\u001b[39m \u001b[2m143 \u001b[32;22m+\u001b[38;2;205;214;244m <article>\r\n\u001b[39m \u001b[2m144 \u001b[32;22m+\u001b[38;2;205;214;244m <h2>\r\n\u001b[39m \u001b[2m145 \u001b[32;22m+\u001b[38;2;205;214;244m <a href=\"{% url 'blog:post_de\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mtail' post.pk %}\">\r\n\u001b[39m \u001b[2m146 \u001b[32;22m+\u001b[38;2;205;214;244m {{ post.title|upper }}\r\n\u001b[39m \u001b[2m147 \u001b[32;22m+\u001b[38;2;205;214;244m </a>\r\n\u001b[39m \u001b[2m148 \u001b[32;22m+\u001b[38;2;205;214;244m </h2>\r\n\u001b[39m \u001b[2m149 \u001b[32;22m+\r\n\u001b[39m \u001b[2m150 \u001b[32;22m+\u001b[38;2;205;214;244m {% if post.is_published %}\r\n\u001b[39m \u001b[2m151 \u001b[32;22m+\u001b[38;2;205;214;244m <p>{{ post.created_at|date:\"Y\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m-m-d\" }}</p>\r\n\u001b[39m \u001b[2m152 \u001b[32;22m+\u001b[38;2;205;214;244m {% endif %}\r\n\u001b[39m \u001b[2m153 \u001b[32;22m+\u001b[38;2;205;214;244m </article>\r\n\u001b[39m \u001b[2m154 \u001b[32;22m+\u001b[38;2;205;214;244m{% empty %}\r\n\u001b[39m \u001b[2m155 \u001b[32;22m+\u001b[38;2;205;214;244m <p>Постов нет.</p>\r\n\u001b[39m \u001b[2m156 \u001b[32;22m+\u001b[38;2;205;214;244m{% endfor %}\r\n\u001b[39m \u001b[2m157 \u001b[32;22m+\u001b[38;2;147;153;178m```\r\n\u001b[39m \u001b[2m158 \u001b[32;22m+\r\n\u001b[0m \u001b[2m159 \u001b[0m \u001b[38;2;147;153;178m###\u001b[38;2;249;226;175m \u001b[38;2;148;226;213mНаследование шаблонов\u001b[10X\r\n\u001b[0m \u001b[2m ⋮\r\n\u001b[0m \u001b[2m163\r\n\u001b[48;5;22;22m \u001b[2m164 \u001b[32;22m+\u001b[38;2;147;153;178m```\u001b[38;2;205;214;244mhtml\u001b[28X\r\n\u001b[39m \u001b[2m165 \u001b[32;22m+\u001b[38;2;205;214;244m<!-- templates/base.html -->\r\n\u001b[39m \u001b[2m166 \u001b[32;22m+\u001b[38;2;205;214;244m<!doctype html>\r\n\u001b[39m \u001b[2m167 \u001b[32;22m+\u001b[38;2;205;214;244m<html lang=\"ru\">\r\n\u001b[39m \u001b[2m168 \u001b[32;22m+\u001b[38;2;205;214;244m <head>\r\n\u001b[39m \u001b[2m169 \u001b[32;22m+\u001b[38;2;205;214;244m <title>{% block title %}Сайт{%\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mendblock %}</title>\r\n\u001b[39m \u001b[2m170 \u001b[32;22m+\u001b[38;2;205;214;244m </head>\r\n\u001b[39m \u001b[2m171 \u001b[32;22m+\u001b[38;2;205;214;244m <body>\r\n\u001b[39m \u001b[2m172 \u001b[32;22m+\u001b[38;2;205;214;244m <main>\r\n\u001b[39m \u001b[2m173 \u001b[32;22m+\u001b[38;2;205;214;244m {% block content %}{% endbloc\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mk %}\r\n\u001b[39m \u001b[2m174 \u001b[32;22m+\u001b[38;2;205;214;244m </main>\r\n\u001b[39m \u001b[2m175 \u001b[32;22m+\u001b[38;2;205;214;244m </body>\r\n\u001b[39m \u001b[2m176 \u001b[32;22m+\u001b[38;2;205;214;244m</html>\r\n\u001b[39m \u001b[2m177 \u001b[32;22m+\u001b[38;2;147;153;178m```\r\n\u001b[39m \u001b[2m178 \u001b[32;22m+\r\n\u001b[39m \u001b[2m179 \u001b[32;22m+\u001b[38;2;147;153;178m```\u001b[38;2;205;214;244mhtml\r\n\u001b[39m \u001b[2m180 \u001b[32;22m+\u001b[38;2;205;214;244m<!-- templates/blog/list.html -->\r\n\u001b[39m \u001b[2m181 \u001b[32;22m+\u001b[38;2;205;214;244m{% extends \"base.html\" %}\r\n\u001b[39m \u001b[2m182 \u001b[32;22m+\r\n\u001b[39m \u001b[2m183 \u001b[32;22m+\u001b[38;2;205;214;244m{% block title %}Посты{% endblock %\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m}\r\n\u001b[39m \u001b[2m184 \u001b[32;22m+\r\n\u001b[39m \u001b[2m185 \u001b[32;22m+\u001b[38;2;205;214;244m{% block content %}\r\n\u001b[39m \u001b[2m186 \u001b[32;22m+\u001b[38;2;205;214;244m <h1>Посты</h1>\r\n\u001b[39m \u001b[2m187 \u001b[32;22m+\r\n\u001b[39m \u001b[2m188 \u001b[32;22m+\u001b[38;2;205;214;244m {% for post in posts %}\r\n\u001b[39m \u001b[2m189 \u001b[32;22m+\u001b[38;2;205;214;244m <a href=\"{% url 'blog:post_deta\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mil' post.pk %}\">\r\n\u001b[39m \u001b[2m190 \u001b[32;22m+\u001b[38;2;205;214;244m {{ post.title }}\r\n\u001b[39m \u001b[2m191 \u001b[32;22m+\u001b[38;2;205;214;244m </a>\r\n\u001b[39m \u001b[2m192 \u001b[32;22m+\u001b[38;2;205;214;244m {% endfor %}\r\n\u001b[39m \u001b[2m193 \u001b[32;22m+\u001b[38;2;205;214;244m{% endblock %}\r\n\u001b[39m \u001b[2m194 \u001b[32;22m+\u001b[38;2;147;153;178m```\r\n\u001b[39m \u001b[2m195 \u001b[32;22m+\r\n\u001b[0m \u001b[2m196 \u001b[0m \u001b[38;2;147;153;178m---\u001b[32X\r\n\u001b[0m \u001b[2m ⋮\r\n\u001b[0m \u001b[2m201 \u001b[0m \u001b[38;2;147;153;178m-\u001b[38;2;205;214;244m В продакшне используется команда\r\n\u001b[0m \u001b[2m \u001b[38;2;147;153;178;22m`\u001b[38;2;205;214;244mpython manage.py collectstatic\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m.\r\n\u001b[39;48;5;22m \u001b[2m202 \u001b[32;22m+\u001b[35X\r\n\u001b[39m \u001b[2m203 \u001b[32;22m+\u001b[38;2;205;214;244mСтатика — это CSS, JavaScript, изоб\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mражения и другие файлы, которые не\r\n\u001b[39m \u001b[2m207 \u001b[32;22m+\u001b[38;2;250;179;135mSTATIC_URL\u001b[38;2;205;214;244m \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m\"static/\"\r\n\u001b[39m \u001b[2m208 \u001b[32;22m+\u001b[38;2;250;179;135mSTATICFILES_DIRS\u001b[38;2;205;214;244m \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m[\u001b[38;2;250;179;135mBASE_DIR\u001b[38;2;205;214;244m \u001b[38;2;148;226;213m/\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m\"sta\r\n\u001b[39m \u001b[2m \u001b[38;2;166;227;161;22mtic\"\u001b[38;2;147;153;178m]\r\n\u001b[39m \u001b[2m209 \u001b[32;22m+\u001b[38;2;147;153;178m```\r\n\u001b[39m \u001b[2m210 \u001b[32;22m+\r\n\u001b[39m \u001b[2m211 \u001b[32;22m+\u001b[38;2;147;153;178m```\u001b[38;2;205;214;244mhtml\r\n\u001b[39m \u001b[2m212 \u001b[32;22m+\u001b[38;2;205;214;244m{% load static %}\r\n\u001b[39m \u001b[2m213 \u001b[32;22m+\r\n\u001b[39m \u001b[2m214 \u001b[32;22m+\u001b[38;2;205;214;244m<link rel=\"stylesheet\" href=\"{% sta\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mtic 'css/app.css' %}\">\r\n\u001b[39m \u001b[2m215 \u001b[32;22m+\u001b[38;2;205;214;244m<script src=\"{% static 'js/app.js'\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m%}\"></script>\r\n\u001b[39m \u001b[2m216 \u001b[32;22m+\u001b[38;2;147;153;178m```\r\n\u001b[39m \u001b[2m217 \u001b[32;22m+\r\n\u001b[39m \u001b[2m218 \u001b[32;22m+\u001b[38;2;147;153;178m```\u001b[38;2;205;214;244mbash\r\n\u001b[39m \u001b[2m219 \u001b[32;22m+\u001b[38;2;137;180;250mpython\u001b[38;2;205;214;244m manage.py collectstatic\r\n\u001b[39m \u001b[2m220 \u001b[32;22m+\u001b[38;2;147;153;178m```\r\n\u001b[0m\u001b[44X\r\n\u001b[2m────────────────────────────────────────────\r\n\r\n• \u001b[0mОсновной текст готов. Сейчас проверю\r\n Markdown-фрагменты и обновлю строку в\r\n индексе, где статус ещё \u001b[36mseed\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 CBV.md\u001b[2m, \u001b[0mINDEX.md\r\n\r\n\u001b[2m• \u001b[1;22mEdited\u001b[0m 99 System/INDEX.md (\u001b[32m+1\u001b[0m \u001b[31m-1\u001b[0m)\r\n \u001b[2m524 \u001b[0m \u001b[38;2;205;214;244m| [[Django: Модели и ORM]] | Django\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22m: Модели и ORM | processing | conce\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22mpt | [django, backend, orm, databas\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22me, migrations] |\r\n\u001b[39;48;5;52m \u001b[2m525 \u001b[31;22m-\u001b[38;2;205;214;244;2m| [[Django: Представления, шаблоны\u001b[1X\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244mи CBV]] | Django: Представления, ша\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244mблоны и CBV | seed | concept | [dja\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244mngo, routing, templates, cbv, fbv]\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244m|\r\n\u001b[39;48;5;22;22m \u001b[2m525 \u001b[32;22m+\u001b[38;2;205;214;244m| [[Django: Представления, шаблоны\u001b[1X\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mи CBV]] | Django: Представления, ша\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mблоны и CBV | processing | concept\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m| [django, routing, templates, cbv,\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m fbv] |\r\n\u001b[0m \u001b[2m526 \u001b[0m \u001b[38;2;205;214;244m| [[Django: Работа с формами и CUD]\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22m] | Django: Работа с формами и CUD\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22m| seed | concept | [django, forms,\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22mcrud, validation, modelform] |\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 Library/\r\n\u001b[39;2m │ \u001b[38;2;166;227;161;22mProgramming/Python/Django:\r\n\u001b[39;2m │ \u001b[38;2;166;227;161;22mПредставления, шаблоны и CBV.md'\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m'99\r\n\u001b[39;2m │ … +1 lines\r\n └ .../Python/Django: Представления,\r\n\u001b[0m \u001b[2mшаблоны и CBV.md | 159 +++++++++++++++++\r\n … +3 lines (ctrl + t to view transcript)\r\n\u001b[0m \u001b[2m 2 files changed, 156 insertions(+), 5\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 --\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/Python/Django:\r\n\u001b[39;2m │ \u001b[38;2;166;227;161;22mПредставления, шаблоны и CBV.md'\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m'99\r\n\u001b[39;2m │ … +1 lines\r\n────────────────────────────────────────────\r\n\r\n• \u001b[0mГотово.\r\n\r\n В \u001b[36m90 Library/Programming/Python/Django:\r\n\u001b[0m - FBV;\r\n - CBV: \u001b[36mTemplateView\u001b[0m, \u001b[36mListView\u001b[0m,\r\n \u001b[36mDetailView\u001b[0m, \u001b[36m.as_view()\u001b[0m;\r\n\r\n - DTL: переменные, теги, фильтры;\r\n - наследования шаблонов;\r\n - статических файлов.\r\n\r\n Также исправил \u001b[36mtitle\u001b[0m внутри заметки под\r\n название файла, перевёл статус в\r\n \u001b[36mprocessing\u001b[0m и обновил \u001b[36m99 System/\r\n\u001b[0m \u001b[36mINDEX.md:525\u001b[0m.\r\n\r\n\u001b[2m─ Worked for 1m 10s ────────────────────────\r\n\r\n\u001b[48;5;238;22m\u001b[44X\r\n\u001b[1;2m› \u001b[22;22mконвертеры распиши подробнее\r\n\r\n\u001b[0m\u001b[44X\r\n\u001b[2m• \u001b[0mПлан: расширю только часть про URL-\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 Django: Представления, шаблоны и\r\n\u001b[2m \u001b[0mCBV.md\r\n\r\n\u001b[2m────────────────────────────────────────────\r\n\r\n• \u001b[0mВставлю пояснение сразу после текущего\r\n списка, чтобы примеры маршрутов ниже стали\r\n понятнее.\r\n\r\n\u001b[2m• \u001b[1;22mEdited\u001b[0m 90 Library/Programming/Python/\r\nDjango: Представления, шаблоны и CBV.md (\u001b[32m+20\r\n\u001b[31m-0\u001b[0m)\r\n \u001b[2m18\r\n\u001b[48;5;22;22m \u001b[2m19 \u001b[32;22m+\u001b[38;2;205;214;244mКонвертеры вытаскивают часть URL, пр\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mоверяют её тип и передают во view ка\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mк аргумент:\r\n\u001b[39m \u001b[2m20 \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<str:name>\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[2m21 \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<int:pk>\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[2m22 \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<slug:slug>\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_\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.\r\n\u001b[39m \u001b[2m23 \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<uuid:id>\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m — UUID, например \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m0751\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m94d3-6885-417e-a8a8-6c931e272f00\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m.\r\n\u001b[39m \u001b[2m24 \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<path:subpath>\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[2m25 \u001b[32;22m+\r\n\u001b[0m \u001b[2m ⋮\u001b[36X\r\n\u001b[0m \u001b[2m47 \u001b[0m \u001b[38;2;166;227;161m path(\"<int:pk>/\", views.post_det\r\n\u001b[0m \u001b[2m \u001b[38;2;166;227;161;22mail, name=\"post_detail\"),\r\n\u001b[39;48;5;22m \u001b[2m48 \u001b[32;22m+\u001b[38;2;166;227;161m path(\"tag/<slug:slug>/\", views.p\r\n\u001b[39m \u001b[2m \u001b[38;2;166;227;161;22mosts_by_tag, name=\"posts_by_tag\"),\r\n\u001b[39m \u001b[2m49 \u001b[32;22m+\u001b[38;2;166;227;161m path(\"files/<path:subpath>/\", vi\r\n\u001b[39m \u001b[2m \u001b[38;2;166;227;161;22mews.file_detail, name=\"file_detail\")\r\n\u001b[39m \u001b[2m \u001b[38;2;166;227;161;22m,\r\n\u001b[0m \u001b[2m50 \u001b[0m \u001b[38;2;205;214;244m]\u001b[35X\r\n\u001b[0m \u001b[2m ⋮\r\n\u001b[48;5;22;22m \u001b[2m61 \u001b[32;22m+\u001b[38;2;205;214;244m \u001b[38;2;250;179;135m...\u001b[29X\r\n\u001b[39m \u001b[2m62 \u001b[32;22m+\u001b[38;2;147;153;178m```\r\n\u001b[39m \u001b[2m63 \u001b[32;22m+\r\n\u001b[39;49;2m•\u001b[0m \u001b[1mExplored\u001b[34X\r\n\u001b[22;2m └ \u001b[36;22mRead\u001b[0m Django: Представления, шаблоны и\r\n\u001b[2m \u001b[0mCBV.md\r\n\r\n\u001b[2m────────────────────────────────────────────\r\n\r\n• \u001b[0mГотово.\r\n\r\n В \u001b[36m90 Library/Programming/Python/Django:\r\n\u001b[0m \u001b[36mПредставления, шаблоны и CBV.md:19\r\n\u001b[0m подробнее расписал URL-конвертеры: \u001b[36mstr\u001b[0m,\r\n \u001b[36mint\u001b[0m, \u001b[36mslug\u001b[0m, \u001b[36muuid\u001b[0m, \u001b[36mpath\u001b[0m, плюс добавил\r\n примеры маршрутов и аргументов во view.\r\n\r\n\u001b[2m────────────────────────────────────────────\r\n\r\n\u001b[48;5;238;22m\u001b[44X\r\n\u001b[1;2m› \u001b[22;22m\"90 Library/Programming/Python/Django:\r\n Работа с формами и CUD.md\" что такое csrf\r\n токен?\r\n\r\n\u001b[0m\u001b[44X\r\n\u001b[2m• \u001b[0mПрочитаю заметку про формы и CUD, чтобы\r\n ответить в её контексте, без правок файла.\r\n\r\n\u001b[2m•\u001b[0m \u001b[1mExplored\r\n\u001b[22;2m └ \u001b[36;22mRead\u001b[0m Django: Работа с формами и 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 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\"Django: Работа с формами\r\n\u001b[39;2m │ \u001b[38;2;166;227;161;22mи CUD|csrf|CSRF|token|токен\"\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m'99\r\n\u001b[39;2m │ \u001b[38;2;166;227;161;22mSystem/INDEX.md'\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m'90 Library/\r\n\u001b[39;2m │ … +2 lines\r\n └ 2 matches in 2F:\r\n … +9 lines (ctrl + t to view transcript)\r\n\u001b[0m \u001b[2mconcept |...\r\n\r\n\r\n────────────────────────────────────────────\r\n\r\n• \u001b[0mПрочитал: [[Django: Работа с формами и\r\n CUD]].\r\n\r\n \u001b[36mcsrf_token\u001b[0m — это защитный токен от CSRF-\r\n атаки.\r\n CSRF: злоумышленник заставляет браузер уже\r\n авторизованного пользователя отправить\r\n POST-запрос на твой сайт. Например,\r\n пользователь залогинен в админке,\r\n объекта.\r\n\r\n Django защищается так:\r\n\r\n \u001b[38;2;148;226;213m<\u001b[38;2;137;180;250mform\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mmethod\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"post\"\u001b[38;2;148;226;213m>\r\n\u001b[0m \u001b[38;2;205;214;244m {% csrf_token %}\r\n\u001b[0m \u001b[38;2;205;214;244m {{ form.as_p }}\r\n\u001b[0m \u001b[38;2;205;214;244m \u001b[38;2;148;226;213m<\u001b[38;2;137;180;250mbutton\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mtype\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"submit\"\u001b[38;2;148;226;213m>\u001b[38;2;205;214;244mСохранить\u001b[38;2;148;226;213m</\u001b[38;2;137;180;250mbutton\u001b[38;2;148;226;213m>\r\n\u001b[0m поле с одноразовым/сеансовым токеном. При\r\n POST-запросе Django проверяет: токен из\r\n формы совпадает с токеном пользователя.\r\n Если токена нет или он неправильный —\r\n запрос отклоняется.\r\n\r\n Коротко: \u001b[36mcsrf_token\u001b[0m нужен во всех HTML-\r\n формах с \u001b[36mmethod=\"post\"\u001b[0m: создание,\r\n редактирование, удаление.\r\n\r\n\u001b[2m────────────────────────────────────────────\r\n\r\n\u001b[48;5;238;22m\u001b[44X\r\n\u001b[1;2m› \u001b[22;22mдобавь информацию про него и, в целом,\r\n\u001b[49;2m• \u001b[0mПлан: обновлю эту заметку точечно: добавлю\r\n понятное объяснение CSRF рядом с шаблоном\r\n формы, перепишу сухие пункты простым\r\n языком и добавлю короткие примеры. Ещё\r\n вижу проблему: в frontmatter нет\r\n обязательного \u001b[36mtitle\u001b[0m, а статус \u001b[36mseed\u001b[0m;\r\n исправлю на \u001b[36mprocessing\u001b[0m и обновлю индекс.\r\n\r\n\u001b[2m•\u001b[0m \u001b[1mExplored\r\n\u001b[22;2m └ \u001b[36;22mRead\u001b[0m Django: Работа с формами и CUD.md\r\n\r\n\u001b[2m────────────────────────────────────────────\r\n\r\n• \u001b[0mСейчас заметка краткая и местами\r\n справочная. Перепишу в том же порядке:\r\n формы, жизненный цикл, валидация, CBV,\r\n шаблон и CSRF.\r\n\r\n\u001b[2m────────────────────────────────────────────\r\n\r\n• \u001b[0mПатч не применился: файл отличается от\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 Django: Работа с формами и CUD.md\r\n\r\n\u001b[2m• \u001b[1;22mEdited\u001b[0m 90 Library/Programming/Python/\r\nDjango: Работа с формами и CUD.md (\u001b[32m+129\u001b[0m \u001b[31m-27\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[23X\r\n\u001b[39;48;5;22;22m \u001b[2m 2 \u001b[32;22m+\u001b[38;2;205;214;244mstatus: processing\u001b[17X\r\n\u001b[0m \u001b[2m 3 \u001b[0m \u001b[38;2;205;214;244mtype: concept\u001b[22X\r\n\u001b[0m \u001b[2m ⋮\r\n\u001b[0m \u001b[2m 11 \u001b[0m \u001b[38;2;205;214;244mupdated: 2026-05-31\r\n\u001b[39;48;5;22m \u001b[2m 12 \u001b[32;22m+\u001b[38;2;205;214;244mtitle: \"Django: Работа с формами и\u001b[1X\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mCUD\"\r\n\u001b[0m \u001b[2m 13 \u001b[0m \u001b[38;2;205;214;244msource:\u001b[28X\r\n\u001b[0m \u001b[2m ⋮\r\n\u001b[0m \u001b[2m 18\r\n\u001b[48;5;52;22m \u001b[2m 18 \u001b[31;22m-\u001b[38;2;147;153;178;2m#\u001b[38;2;243;139;168m \u001b[38;2;148;226;213mDjango: Формы и CUD\u001b[14X\r\n\u001b[39;48;5;22;22m \u001b[2m 19 \u001b[32;22m+\u001b[38;2;147;153;178m#\u001b[38;2;243;139;168m \u001b[38;2;148;226;213mDjango: Работа с формами и CUD\u001b[3X\r\n\u001b[39m \u001b[2m 20 \u001b[32;22m+\r\n\u001b[39m \u001b[2m 21 \u001b[32;22m+\u001b[38;2;147;153;178m**\u001b[38;2;243;139;168;1mCUD (Create, Update, Delete)\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[0m \u001b[2m 22\u001b[37X\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, Delete)\u001b[38;2;147;153;178;22m**\u001b[38;2;205;214;244m —\u001b[1X\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244mоперации изменения данных. Django п\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 23 \u001b[32;22m+\u001b[38;2;205;214;244mФорма в Django — это слой между HTM\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mL-формой и 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ет их, приводит к нормальным типам\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mи помогает сохранить результат.\r\n\u001b[0m \u001b[2m 24\u001b[37X\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 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`**\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 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в, отправки email.\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`**\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охранять объект через \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mform.save()\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 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блицу напрямую — чаще подходит \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mfor\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mms.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ть \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[37X\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 forms\u001b[11X\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 Blog\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;175mModelForm\u001b[38;2;147;153;178m):\u001b[3X\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', 'tagline'\r\n\u001b[39;22m \u001b[2m \u001b[38;2;166;227;161m]\r\n\u001b[39;48;5;22;22m \u001b[2m 40 \u001b[32;22m+\u001b[38;2;166;227;161m fields = [\"name\", \"tagline\"\r\n\u001b[39m \u001b[2m \u001b[38;2;166;227;161;22m]\r\n\u001b[0m \u001b[2m 41 \u001b[0m \u001b[38;2;166;227;161m widgets = {\u001b[16X\r\n\u001b[39;48;5;52m \u001b[2m 32 \u001b[31;22m-\u001b[38;2;166;227;161;2m 'name': forms.TextInput\r\n\u001b[39;22m \u001b[2m \u001b[38;2;166;227;161m(attrs={'class': 'form-control'})\r\n\u001b[39;48;5;22;22m \u001b[2m 42 \u001b[32;22m+\u001b[38;2;166;227;161m \"name\": forms.TextInput\r\n\u001b[39m \u001b[2m \u001b[38;2;166;227;161;22m(attrs={\"class\": \"form-control\"})\r\n\u001b[0m \u001b[2m 43 \u001b[0m \u001b[38;2;166;227;161m }\u001b[26X\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 работает так:\u001b[10X\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 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 создаёт форму из \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mreq\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22muest.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 Проверяет данные через \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mis_valid\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 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ет действие и делает \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 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[26X\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;247mimport\u001b[38;2;205;214;244m redire\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mct\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;172mrequest\u001b[38;2;147;153;178m):\u001b[9X\r\n\u001b[0m \u001b[2m ⋮\r\n\u001b[0m \u001b[2m 62 \u001b[0m \u001b[38;2;166;227;161m form = ContactForm(request.\r\n\u001b[0m \u001b[2m \u001b[38;2;166;227;161;22mPOST)\r\n\u001b[39;48;5;22m \u001b[2m 63 \u001b[32;22m+\u001b[35X\r\n\u001b[0m \u001b[2m 64 \u001b[0m \u001b[38;2;166;227;161m if form.is_valid():\u001b[8X\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.cleaned_data\r\n\u001b[0m \u001b[2m 65 \u001b[0m \u001b[38;2;166;227;161m data = form.cleaned_dat\r\n\u001b[0m \u001b[2m \u001b[38;2;166;227;161;22ma\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или отправка email)\r\n\u001b[39;22m \u001b[2m 47 \u001b[31;22m-\u001b[38;2;166;227;161;2m return redirect('succes\r\n\u001b[39;22m \u001b[2m \u001b[38;2;166;227;161ms')\r\n\u001b[39;48;5;22;22m \u001b[2m 66 \u001b[32;22m+\u001b[38;2;166;227;161m send_email(data[\"email\"\r\n\u001b[39m \u001b[2m \u001b[38;2;166;227;161;22m], data[\"message\"])\r\n\u001b[39m \u001b[2m 67 \u001b[32;22m+\u001b[38;2;166;227;161m return redirect(\"succes\r\n\u001b[39m \u001b[2m \u001b[38;2;166;227;161;22ms\")\r\n\u001b[0m \u001b[2m 68 \u001b[0m \u001b[38;2;166;227;161m else:\u001b[26X\r\n\u001b[0m \u001b[2m 69 \u001b[0m \u001b[38;2;166;227;161m form = ContactForm()\r\n\u001b[39;48;5;52m \u001b[2m 50 \u001b[31;22m-\u001b[38;2;166;227;161;2m return render(request, 'contact\r\n\u001b[39;22m \u001b[2m \u001b[38;2;166;227;161m.html', {'form': form})\r\n\u001b[39;48;5;22;22m \u001b[2m 70 \u001b[32;22m+\u001b[35X\r\n\u001b[39m \u001b[2m 71 \u001b[32;22m+\u001b[38;2;166;227;161m return render(request, \"contact\r\n\u001b[39m \u001b[2m \u001b[38;2;166;227;161;22m.html\", {\"form\": form})\r\n\u001b[0m \u001b[2m 72 \u001b[0m \u001b[38;2;147;153;178m```\u001b[32X\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[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 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Автоматическая очистка\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 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_<fieldname>()\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;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ерку формы. После него появляются \u001b[38;2;147;153;178m`\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mform.cleaned_data\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m и \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mform.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Автоматическая очистка\u001b[38;2;147;153;178;22m**\u001b[38;2;205;214;244m — Djan\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mgo превращает строки из HTML-формы\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mв Python-типы: число в \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mint\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;244mdate\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m, email в строку после пров\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_<fieldname>()\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 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 forms\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;175mforms\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;250mCharField\u001b[38;2;147;153;178m(\u001b[38;2;235;160;172mmax_\r\n\u001b[39m \u001b[2m \u001b[38;2;235;160;172;22mlength\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;250mCharField\u001b[38;2;147;153;178m(\u001b[38;2;235;160;172mwidg\r\n\u001b[39m \u001b[2m \u001b[38;2;235;160;172;22met\u001b[38;2;148;226;213m=\u001b[38;2;205;214;244mforms\u001b[38;2;148;226;213m.\u001b[38;2;205;214;244mPasswordInput\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;250mforms\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mCharFie\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mld\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;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(\u001b[38;2;235;160;172mself\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\u001b[38;2;148;226;213m.\u001b[38;2;235;160;172mcleaned_dat\r\n\u001b[39m \u001b[2m \u001b[38;2;235;160;172;22ma\u001b[38;2;147;153;178m[\u001b[38;2;166;227;161m\"username\"\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;250mlower\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\"adm\r\n\u001b[39m \u001b[2m \u001b[38;2;166;227;161;22min\"\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\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mValidationE\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mrror\u001b[38;2;147;153;178m(\u001b[38;2;166;227;161m\"Это имя нельзя использовать\"\u001b[38;2;147;153;178m)\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=\u001b[38;2;205;214;244m \u001b[38;2;250;179;135msuper\u001b[38;2;147;153;178m()\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mclea\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mn\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;250mcleaned_data\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mget\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m(\u001b[38;2;166;227;161m\"password\"\u001b[38;2;147;153;178m)\r\n\u001b[39m \u001b[2m102 \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;250mcleaned_d\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mata\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_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\u001b[38;2;205;214;244m password_re\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mpeat \u001b[38;2;203;166;247mand\u001b[38;2;205;214;244m password \u001b[38;2;148;226;213m!=\u001b[38;2;205;214;244m password_repea\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mt\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\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mValidationE\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mrror\u001b[38;2;147;153;178m(\u001b[38;2;166;227;161m\"Пароли не совпадают\"\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_data\r\n\u001b[39m \u001b[2m108 \u001b[32;22m+\u001b[38;2;147;153;178m```\r\n\u001b[0m \u001b[2m109\u001b[37X\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 Views (CBV для C\r\n\u001b[0m \u001b[2m \u001b[38;2;148;226;213;22mUD)\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 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`\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 подтверждения через 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[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т; обычно ищет его по \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; требует подтверждения через \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[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`\u001b[38;2;205;214;244mPOST\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`\u001b[38;2;205;214;244ms\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mave()\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 после успеха.\r\n\u001b[0m \u001b[2m119\u001b[37X\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[24X\r\n\u001b[0m \u001b[2m120 \u001b[0m \u001b[38;2;147;153;178m```\u001b[38;2;205;214;244mpython\u001b[26X\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\u001b[38;2;205;214;244m reverse_laz\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22my\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;244mgeneric \u001b[38;2;203;166;247mimport\u001b[38;2;205;214;244m Cr\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22meateView\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m DeleteView\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 BlogForm\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 Blog\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;175mCreateView\u001b[38;2;147;153;178m):\u001b[2X\r\n\u001b[0m \u001b[2m ⋮\r\n\u001b[0m \u001b[2m131 \u001b[0m \u001b[38;2;166;227;161m template_name = \"blog/blog_form\r\n\u001b[0m \u001b[2m \u001b[38;2;166;227;161;22m.html\"\r\n\u001b[39;48;5;52m \u001b[2m 75 \u001b[31;22m-\u001b[38;2;166;227;161;2m success_url = reverse_lazy('blo\r\n\u001b[39;22m \u001b[2m \u001b[38;2;166;227;161mg_list')\r\n\u001b[39;48;5;22;22m \u001b[2m132 \u001b[32;22m+\u001b[38;2;166;227;161m success_url = reverse_lazy(\"blo\r\n\u001b[39m \u001b[2m \u001b[38;2;166;227;161;22mg_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(UpdateView):\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 = BlogForm\r\n\u001b[39m \u001b[2m138 \u001b[32;22m+\u001b[38;2;205;214;244m template_name = \"blog/blog_form\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m.html\"\r\n\u001b[39m \u001b[2m139 \u001b[32;22m+\u001b[38;2;205;214;244m success_url = reverse_lazy(\"blo\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mg_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(DeleteView):\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 = \"blog/blog_conf\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mirm_delete.html\"\r\n\u001b[39m \u001b[2m145 \u001b[32;22m+\u001b[38;2;205;214;244m success_url = reverse_lazy(\"blo\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mg_list\")\r\n\u001b[0m \u001b[2m146 \u001b[0m \u001b[38;2;147;153;178m```\u001b[32X\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[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 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`\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 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;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и поля формы в \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m<p>\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`\u001b[38;2;205;214;244m — вывести п\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-разметка, 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<form method=\"post\">\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 <button type=\"submit\">Сохранить</\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mbutton>\r\n\u001b[39m \u001b[2m158 \u001b[32;22m+\u001b[38;2;205;214;244m</form>\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[28X\r\n\u001b[39;48;5;22m \u001b[2m162 \u001b[32;22m+\u001b[38;2;205;214;244m<form method=\"post\">\u001b[15X\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 %}\u001b[12X\r\n\u001b[39;48;5;52m \u001b[2m 84 \u001b[31;22m-\u001b[38;2;205;214;244;2m {{ field.label_tag }} {{ 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 <div>\u001b[26X\r\n\u001b[39m \u001b[2m167 \u001b[32;22m+\u001b[38;2;205;214;244m {{ field.label_tag }}\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[2m170 \u001b[32;22m+\u001b[38;2;205;214;244m </div>\r\n\u001b[0m \u001b[2m171 \u001b[0m \u001b[38;2;205;214;244m{% endfor %}\u001b[23X\r\n\u001b[39;48;5;22m \u001b[2m172 \u001b[32;22m+\u001b[35X\r\n\u001b[39m \u001b[2m173 \u001b[32;22m+\u001b[38;2;205;214;244m <button type=\"submit\">Сохранить</\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mbutton>\r\n\u001b[39m \u001b[2m174 \u001b[32;22m+\u001b[38;2;205;214;244m</form>\r\n\u001b[0m \u001b[2m175 \u001b[0m \u001b[38;2;147;153;178m```\u001b[32X\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 Не забывайте про \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m{% csrf_\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244mtoken %}\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>\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[35X\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 Request Forgery)\r\n\u001b[39;22m \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уже авторизованного пользователя.\r\n\u001b[39m \u001b[2m179 \u001b[32;22m+\r\n\u001b[39m \u001b[2m180 \u001b[32;22m+\u001b[38;2;205;214;244mПример: пользователь залогинен в Dj\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mango-приложении. Он открывает вредн\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[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<input type=\"hidden\" name=\"csrfmidd\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mlewaretoken\" value=\"...\">\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[2m189 \u001b[32;22m+\r\n\u001b[39m \u001b[2m190 \u001b[32;22m+\u001b[38;2;205;214;244mКороткое правило: во все HTML-формы\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m с \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mmethod=\"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{% cs\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mrf_token %}\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m.\r\n\u001b[0m\u001b[44X\r\n\u001b[2m────────────────────────────────────────────\r\n\r\n• \u001b[0mТекст внесён. Проверяю итог и обновляю\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: Работа с формами и CUD.md\u001b[2m,\r\n\u001b[0m INDEX.md\r\n\r\n\u001b[2m• \u001b[1;22mEdited\u001b[0m 99 System/INDEX.md (\u001b[32m+1\u001b[0m \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]] | Django: Представления, ша\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22mблоны и CBV | processing | concept\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22m| [django, routing, templates, cbv,\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22m fbv] |\r\n\u001b[39;48;5;52m \u001b[2m \u001b[38;2;205;214;244mation, modelform] |\u001b[16X\r\n\u001b[39;48;5;22;22m \u001b[2m526 \u001b[32;22m+\u001b[38;2;205;214;244m| [[Django: Работа с формами и CUD]\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m] | Django: Формы и CUD | processin\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mg | concept | [django, forms, crud,\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m validation, modelform] |\r\n\u001b[0m \u001b[2m527 \u001b[0m \u001b[38;2;205;214;244m| [[Python - MOC]] | Python - MOC |\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22m seed | moc | [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]] | — | seed | know\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22mledge | [travel] |\r\n\u001b[39;48;5;52m \u001b[2m770 \u001b[31;22m-\u001b[35X\r\n\u001b[0m\u001b[44X\r\n\u001b[2m• \u001b[1;22mEdited\u001b[0m 90 Library/Programming/Python/\r\nDjango: Работа с формами и 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 %}\u001b[12X\r\n\u001b[39;48;5;22;22m \u001b[2m165 \u001b[32;22m+\u001b[38;2;205;214;244m {% for field in form %}\u001b[10X\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[26X\r\n\u001b[0m \u001b[2m ⋮\r\n\u001b[0m \u001b[2m170 \u001b[0m \u001b[38;2;166;227;161m </div>\r\n\u001b[39;48;5;52m \u001b[2m171 \u001b[31;22m-\u001b[38;2;205;214;244;2m{% endfor %}\u001b[23X\r\n\u001b[39;48;5;22;22m \u001b[2m171 \u001b[32;22m+\u001b[38;2;205;214;244m {% endfor %}\u001b[21X\r\n\u001b[0m \u001b[2m172\u001b[37X\r\n\r\n•\u001b[0m \u001b[1mExplored\r\n\u001b[22;2m └ \u001b[36;22mRead\u001b[0m Django: Работа с формами и 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 Library/\r\n\u001b[39;2m │ \u001b[38;2;166;227;161;22mProgramming/Python/Django: Работа с\r\n\u001b[39;2m │ \u001b[38;2;166;227;161;22mформами и CUD.md'\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;22mProgramming/Python/Django: Работа с\r\n\u001b[39;2m │ \u001b[38;2;166;227;161;22mформами и CUD.md'\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m'99 System/INDEX.md'\r\n\u001b[39;2m └\r\n\r\n────────────────────────────────────────────\r\n\r\n• \u001b[0mГотово.\r\n\r\n В \u001b[36m90 Library/Programming/Python/Django:\r\n\u001b[0m \u001b[36mРабота с формами и CUD.md:1\u001b[0m добавил\r\n простые пояснения про формы, \u001b[36mForm\u001b[0m/\r\n \u001b[36mModelForm\u001b[0m, жизненный цикл формы,\r\n валидацию, CBV для CUD и отображение в\r\n шаблоне.\r\n\r\n Отдельно добавил раздел \u001b[36mCSRF-токен\u001b[0m: что\r\n это за атака, зачем нужен \u001b[36m{% csrf_token\r\n\u001b[0m \u001b[36m%}\u001b[0m, что он вставляет в HTML и когда его\r\n использовать. Статус заметки обновил на\r\n \u001b[36mprocessing\u001b[0m, индекс тоже поправил.\r\n\r\n\u001b[2m─ Worked for 2m 05s ────────────────────────\r\n\r\n\u001b[48;5;238;22m \u001b[43X\r\n\u001b[1m›\u001b[22m \"90 Library/Programming/Web/Основы HTML\r\n (структура, таблицы, формы).md\"\r\n \r\n\u001b[0m\u001b[2X\u001b[2C\u001b[38;2;246;226;183mgpt-5.5 medium\u001b[39;2m · \u001b[38;2;171;223;167;22m~/Documents/Vaults/Secon…\r\n\r\n\r\n\r\n\r\n\r\n\u001b[8A\u001b[34C\u001b[0m",
|
||
"rows": 34,
|
||
"scrollLine": -1
|
||
}
|
||
}
|
||
},
|
||
"pinned": true,
|
||
"icon": "terminal",
|
||
"title": "Terminal: SecondBrain"
|
||
}
|
||
},
|
||
{
|
||
"id": "394fb6e28d09b8f3",
|
||
"type": "leaf",
|
||
"state": {
|
||
"type": "all-properties",
|
||
"state": {
|
||
"sortOrder": "frequency",
|
||
"showSearch": false,
|
||
"searchQuery": ""
|
||
},
|
||
"icon": "lucide-archive",
|
||
"title": "All properties"
|
||
}
|
||
},
|
||
{
|
||
"id": "e51be669e29cd994",
|
||
"type": "leaf",
|
||
"state": {
|
||
"type": "backlink",
|
||
"state": {
|
||
"file": "90 Library/Programming/Web/Основы HTML (структура, таблицы, формы).md",
|
||
"collapseAll": false,
|
||
"extraContext": false,
|
||
"sortOrder": "alphabetical",
|
||
"showSearch": false,
|
||
"searchQuery": "",
|
||
"backlinkCollapsed": false,
|
||
"unlinkedCollapsed": true
|
||
},
|
||
"icon": "links-coming-in",
|
||
"title": "Backlinks for Основы HTML (структура, таблицы, формы)"
|
||
}
|
||
},
|
||
{
|
||
"id": "86ea4ddeaafff092",
|
||
"type": "leaf",
|
||
"state": {
|
||
"type": "outgoing-link",
|
||
"state": {
|
||
"file": "90 Library/Programming/Ruby On Rails/Sidekiq - основа работы.md",
|
||
"linksCollapsed": false,
|
||
"unlinkedCollapsed": true
|
||
},
|
||
"icon": "links-going-out",
|
||
"title": "Outgoing links from Sidekiq - основа работы"
|
||
}
|
||
},
|
||
{
|
||
"id": "a0ffd3bace615787",
|
||
"type": "leaf",
|
||
"state": {
|
||
"type": "outline",
|
||
"state": {
|
||
"followCursor": false,
|
||
"showSearch": false,
|
||
"searchQuery": ""
|
||
},
|
||
"icon": "lucide-list",
|
||
"title": "Outline"
|
||
}
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"direction": "horizontal",
|
||
"width": 446
|
||
},
|
||
"left-ribbon": {
|
||
"hiddenItems": {
|
||
"switcher:Open quick switcher": false,
|
||
"graph:Open graph view": false,
|
||
"canvas:Create new canvas": false,
|
||
"daily-notes:Open today's daily note": false,
|
||
"templates:Insert template": false,
|
||
"command-palette:Open command palette": false,
|
||
"markdown-importer:Open format converter": false,
|
||
"random-note:Open random note": false,
|
||
"audio-recorder:Start/stop recording": false,
|
||
"bases:Create new base": false,
|
||
"omnisearch:Omnisearch": false,
|
||
"templater-obsidian:Templater": false,
|
||
"obsidian-git:Open Git source control": false,
|
||
"obsidian-excalidraw-plugin:New drawing": false,
|
||
"terminal:Open terminal": false
|
||
}
|
||
},
|
||
"active": "06940eb960fc1db5",
|
||
"lastOpenFiles": [
|
||
"90 Library/Programming/Web/Основы HTML (структура, таблицы, формы).md",
|
||
"90 Library/Programming/Web/CSS: Основы, селекторы и блочная модель.md",
|
||
"90 Library/Programming/Web/Основы Bootstrap.md",
|
||
"90 Library/Programming/Web/Основы веб-разработки.md",
|
||
"90 Library/Sport/Креатин.md",
|
||
"90 Library/Programming/Python/Python: Базовый синтаксис и основы.md",
|
||
"90 Library/Programming/Python/Python - MOC.md",
|
||
"90 Library/Programming/Python/Django: Работа с формами и CUD.md",
|
||
"90 Library/Programming/Python/Django: Представления, шаблоны и CBV.md",
|
||
"update_index.py",
|
||
"migrate_titles.py",
|
||
"90 Library/Programming/Python/Django: Модели и ORM.md",
|
||
"90 Library/Programming/Python/Курс по Python и Django.md",
|
||
"90 Library/Programming/Web/CSS: Адаптивность, Flexbox и Grid.md",
|
||
"AGENTS.md",
|
||
"CODEX.md",
|
||
"GEMINI.md",
|
||
"CLAUDE.md",
|
||
"90 Library/Finance/Инвестиции/Антихрупкость как управляемая асимметрия.md",
|
||
"90 Library/Finance/Инвестиции/Антихрупкость.md",
|
||
"90 Library/Finance/Инвестиции/Заметки в инвестировании.md",
|
||
"99 System/Archive/04 Tools/🛠️ Неоконченные заметки.md",
|
||
"99 System/Archive/04 Tools/StudyTracker/StudyTracker.md",
|
||
"99 System/Archive/04 Tools/StudyTracker/Books/Books.md",
|
||
"99 System/Archive/04 Tools/StudyTracker/Courses/Courses.md",
|
||
"90 Library/Networking/Основы сетевых технологий.md",
|
||
"90 Library/Machine Learning/Data Science с нуля.md",
|
||
"90 Library/DevOps/Курс по DevOps от Merion.md",
|
||
"99 System/Archive/04 Tools/StudyTracker/Courses",
|
||
"99 System/Archive/04 Tools/StudyTracker/Books",
|
||
"99 System/Archive/04 Tools/StudyTracker",
|
||
"99 System/Archive/04 Tools",
|
||
"99 System/Archive/SocialBase/04 Другие",
|
||
"99 System/Archive/SocialBase/03 Коллеги",
|
||
"99 System/Archive/SocialBase/02 Друзья",
|
||
"99 System/Archive/SocialBase/01 Семья",
|
||
"99 System/Cache/Pasted image 20260526204029.png",
|
||
"99 System/Cache/Pasted image 20260526203848.png",
|
||
"99 System/Cache/Pasted image 20260526203807.png",
|
||
"99 System/Cache/Pasted image 20260521134256.png",
|
||
"99 System/Cache/Pasted image 20260521134238.png",
|
||
"99 System/Cache/Pasted image 20260521134228.png",
|
||
"99 System/Cache/Pasted image 20260521134207.png",
|
||
"99 System/Cache/Pasted image 20260521133832.png",
|
||
"99 System/Cache/Pasted image 20260521133824.png",
|
||
"99 System/Cache/Pasted image 20260521133344.png",
|
||
"00 Inbox/Untitled.canvas"
|
||
]
|
||
} |