From 8517aab23985e48f6c40aa46203a1b600f4bafcb Mon Sep 17 00:00:00 2001 From: Dmitry Date: Sun, 31 May 2026 10:28:49 +0300 Subject: [PATCH] vault backup: 2026-05-31 10:28:49 --- .obsidian/workspace.json | 19 +- ...Основы HTML (структура, таблицы, формы).md | 172 +++++++++++++++++- 99 System/INDEX.md | 2 +- 3 files changed, 175 insertions(+), 18 deletions(-) diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index ba7c079..9d93fca 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -13,13 +13,13 @@ "state": { "type": "markdown", "state": { - "file": "90 Library/Programming/Web/Основы HTML (структура, таблицы, формы).md", - "mode": "preview", + "file": "90 Library/Programming/Web/CSS: Адаптивность, Flexbox и Grid.md", + "mode": "source", "source": false, "backlinks": false }, "icon": "lucide-file", - "title": "Основы HTML (структура, таблицы, формы)" + "title": "CSS: Адаптивность, Flexbox и Grid" } } ] @@ -142,8 +142,8 @@ }, "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\"/\"\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(\"/\", 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
\r\n\u001b[39m \u001b[2m144 \u001b[32;22m+\u001b[38;2;205;214;244m

\r\n\u001b[39m \u001b[2m145 \u001b[32;22m+\u001b[38;2;205;214;244m \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 \r\n\u001b[39m \u001b[2m148 \u001b[32;22m+\u001b[38;2;205;214;244m

\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

{{ post.created_at|date:\"Y\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m-m-d\" }}

\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
\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

Постов нет.

\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\r\n\u001b[39m \u001b[2m166 \u001b[32;22m+\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m167 \u001b[32;22m+\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m168 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m169 \u001b[32;22m+\u001b[38;2;205;214;244m {% block title %}Сайт{%\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mendblock %}\r\n\u001b[39m \u001b[2m170 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m171 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m172 \u001b[32;22m+\u001b[38;2;205;214;244m
\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
\r\n\u001b[39m \u001b[2m175 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m176 \u001b[32;22m+\u001b[38;2;205;214;244m\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\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

Посты

\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 \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 \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\r\n\u001b[39m \u001b[2m215 \u001b[32;22m+\u001b[38;2;205;214;244m\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\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\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\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\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\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(\"/\", 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//\", 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//\", 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\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_()\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_()\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

\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

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