ΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² написании студСнчСских Ρ€Π°Π±ΠΎΡ‚
АнтистрСссовый сСрвис

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΎΠΉ ΠΊΠΎΡ€ΠΏΠΎΡ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ сСти с использованиСм Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ° Django

Π”ΠΈΠΏΠ»ΠΎΠΌΠ½Π°ΡΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠΈΠ£Π·Π½Π°Ρ‚ΡŒ ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒΠΌΠΎΠ΅ΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹

Π’ Π΄ΠΈΠΏΠ»ΠΎΠΌΠ½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Class-Base-View Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΡΠ²Π»ΡΡŽΡ‰Π΅Π΅ΡΡ ΠΊΠΎΡ€ΠΏΠΎΡ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ ΡΠ΅Ρ‚ΡŒΡŽ для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ ККМОО «ΠœΠΎΠ»ΠΎΠ΄Π΅ΠΆΠ½Π°Ρ Π»ΠΈΠ³Π° развития Π½Π°Ρ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΊΡƒΠ»ΡŒΡ‚ΡƒΡ€ ΠšΡƒΠ±Π°Π½ΠΈ», сгСнСрирована Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… Π² PostgeSQL Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΠΏΠΎΠ»Π΅ΠΉ описанных Π² ΠΌΠΎΠ΄Π΅Π»ΡΡ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, c ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ модуля south. ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ осущСствляСт ΠΎΠ±ΠΌΠ΅Π½ сообщСниями, поиск, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΡ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ Π² Π΄Ρ€ΡƒΠ·ΡŒΡ, новостной… Π§ΠΈΡ‚Π°Ρ‚ΡŒ Π΅Ρ‰Ρ‘ >

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΎΠΉ ΠΊΠΎΡ€ΠΏΠΎΡ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ сСти с использованиСм Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ° Django (Ρ€Π΅Ρ„Π΅Ρ€Π°Ρ‚, курсовая, Π΄ΠΈΠΏΠ»ΠΎΠΌ, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ)

Выпускная квалификационная Ρ€Π°Π±ΠΎΡ‚Π°

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΎΠΉ ΠΊΠΎΡ€ΠΏΠΎΡ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ сСти с ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ° Django

ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠΎΡ€ΠΏΠΎΡ€Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ ΡΠ΅Ρ‚ΡŒ ΠšΠΎΡ€ΠΏΠΎΡ€Π°Ρ‚ΠΈΠ²Π½Π°Ρ ΡΠ΅Ρ‚ΡŒ — это ΡΠ΅Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ…, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π°Ρ ΠΏΠΎΠ΄ Π΅Π΄ΠΈΠ½Ρ‹ΠΌ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΈ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Π°Ρ для удовлСтворСния собствСнных производствСнных потрСбностСй ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ ΠΈ ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ. ΠšΠΎΡ€ΠΏΠΎΡ€Π°Ρ‚ΠΈΠ²Π½Π°Ρ информация — это информация, Ρ€Π°Π·Π³Π»Π°ΡˆΠ΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ нСсанкционированноС ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ ΠΎΠ³Ρ€ΠΎΠΌΠ½Ρ‹ΠΌ финансовым потСрям.

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ корпоративная ΡΠ΅Ρ‚ΡŒ — закрытая структура с Π΄ΠΎΡΡ‚Π°Ρ‚ΠΎΡ‡Π½ΠΎ высокой ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒΡŽ Π·Π°Ρ‰ΠΈΡ‚Ρ‹, доступ ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΈΠ·Π²Π½Π΅ Π·Π°ΠΏΡ€Π΅Ρ‰Π΅Π½ Π²ΠΎΠΎΠ±Ρ‰Π΅ ΠΈΠ»ΠΈ строго ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½, Π° Π΄ΠΎΡΡ‚ΡƒΠΏ ΠΊ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π²Π½ΡƒΡ‚Ρ€ΠΈ Π½Π΅Π΅ Ρ€Π°Π·Π³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ с ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ административных ΠΈ Ρ‚СхничСских ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ².

Для обСспСчСния Π·Π°Ρ‰ΠΈΡ‚Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… Π² ΠΊΠΎΡ€ΠΏΠΎΡ€Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… сСтях ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΎΠ½Π½ΠΎ — тСхничСскиС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ (Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ отвСтствСнных спСциалистов, ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ списков контроля доступа, использованиС VPN ΠΈ Ρ‚. ΠΏ.). Π˜Ρ… ΡΠΎΠ²ΠΎΠΊΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ называСтся комплСксной систСмой Π·Π°Ρ‰ΠΈΡ‚Ρ‹ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ.

НСкоторыС Ρ€Π°Π±ΠΎΡ‚ΠΎΠ΄Π°Ρ‚Π΅Π»ΠΈ Π·Π°ΠΏΡ€Π΅Ρ‰Π°ΡŽΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌΠΈ ΡΠΎΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ сСтями Π² Ρ€Π°Π±ΠΎΡ‡Π΅Π΅ врСмя — Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π°Π΄ΠΈ экономии Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Π½ΠΎ ΠΈ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΎΡΠΏΡ€Π΅ΠΏΡΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΡ‚Π΅Ρ‡ΠΊΠ΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ.

Π’ Π΄Π°Π½Π½ΠΎΠΉ Π΄ΠΈΠΏΠ»ΠΎΠΌΠ½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Π΅ прСдставлСна Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π²Π΅Π± прилоТСния, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ доступа ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΌΡƒ интСрфСйсу ΠΈ Π°Π΄ΠΌΠΈΠ½ΠΈΡΡ‚Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ части, ΡΠΎΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ Π²Π·Π°ΠΈΠΌΠΎΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρƒ сотрудниками ΠΈ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΉ ΠΎΠ±ΠΌΠ΅Π½ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ. Π§Ρ‚ΠΎ позволяСт Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ свСсти риск ΠΏΠΎΡ‚Π΅Ρ€ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ΄Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌΡƒ, Π½ΠΎ ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ доступа ΠΊ ΡΠΎΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌ сСтям, компСнсируя это Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ΠΌ собствСнной ΠΊΠΎΡ€ΠΏΠΎΡ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ сСти.

1. Анализ ΠΊΠΎΡ€ΠΏΠΎΡ€Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… сСтСй

ΠšΡ€ΠΎΠΌΠ΅ общСдоступных «Π’ ΠšΠΎΠ½Ρ‚Π°ΠΊΡ‚Π΅», «Facebook», «ΠžΠ΄Π½ΠΎΠΊΠ»Π°ΡΡΠ½ΠΈΠΊΠΈ», ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΊΠΎΡ€ΠΏΠΎΡ€Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ сСти, члСнство Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… доступно Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΈΠ·Π±Ρ€Π°Π½Π½Ρ‹Ρ… ΠΈΠ»ΠΈ для людСй с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ профСссиСй, ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹Π΅ Π² Π΄ΠΎΡΡ‚ΡƒΠΏΠ΅ ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ях ΠΎΠ±ΠΌΠ΅Π½Π° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ. Рассмотрим Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· Π½ΠΈΡ….

1.1 ASmallWorld

Рисунок 1 — ΠšΠΎΡ€ΠΏΠΎΡ€Π°Ρ‚ΠΈΠ²Π½Π°Ρ ΡΠ΅Ρ‚ΡŒ ASmallWorld

Одна ΠΈΠ· ΡΠ°ΠΌΡ‹Ρ… ΠΏΠ΅Ρ€Π²Ρ‹Ρ… ΡΠΊΡΠΊΠ»ΡŽΠ·ΠΈΠ²Π½Ρ‹Ρ… СвропСйских ΡΠΎΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… сСтСй, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰Π°Ρ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ «Π»ΡŽΠ΄Π΅ΠΉ ΠΈΠ· ΠΌΠΈΡ€Π° высокого искусства, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ ΠΏΠΎ Ρ‚Ρ€Π΅ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌ». Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΈΠ³Π»Π°ΡˆΠ΅Π½Ρ‹ ΠΊΠ΅ΠΌ-Ρ‚ΠΎ ΠΈΠ· ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Ρ‡Π»Π΅Π½ΠΎΠ² Π΄Π°Π½Π½ΠΎΠΉ сСти, Π½ΠΎ Π΄Π°ΠΆΠ΅ Π² ΡΡ‚ΠΎΠΌ случаС Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΈ, Ρ‡Ρ‚ΠΎ вас ΠΏΡ€ΠΈΠΌΡƒΡ‚. Π ΡƒΠΊΠΎΠ²ΠΎΠ΄ΠΈΡ‚ ΡΠ΅Ρ‚ΡŒΡŽ 25 — Π»Π΅Ρ‚Π½ΠΈΠΉ ΡˆΠ²Π΅ΠΉΡ†Π°Ρ€Π΅Ρ† ΠŸΠ°Ρ‚Ρ€ΠΈΠΊ Π›ΠΈΠΎΡ‚Π°Ρ€Π΄-Π’ΠΎΠΉΡ‚ (Patrick Liotard-Vogt).

1.2 Decayenne

Одна ΠΈΠ· ΠΏΠ΅Ρ€Π²Ρ‹Ρ… ΠΊΠΎΡ€ΠΏΠΎΡ€Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… сСтСй с ΡΠ»ΠΈΡ‚Π½Ρ‹ΠΌΠΈ участниками Π±Ρ‹Π»Π° основана Π² 2001 Π³ΠΎΠ΄Ρƒ трСмя Π½Π΅ΠΌΠ΅Ρ†ΠΊΠΈΠΌΠΈ бизнСсмСнами. ЧлСнство ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ выдаСтся ΠΏΠΎ ΠΏΡ€ΠΈΠ³Π»Π°ΡˆΠ΅Π½ΠΈΡŽ, хотя Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΠΊ ΡΠΎΠ·Π΄Π°Ρ‚Слям с ΠΏΡ€ΠΎΡΡŒΠ±ΠΎΠΉ ΠΎ Π²ΡΡ‚ΡƒΠΏΠ»Π΅Π½ΠΈΠΈ.

Π‘ΠΎΠ·Π΄Π°Ρ‚Π΅Π»ΠΈ сСти ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ Π΅Π΅ ΠΊΠ°ΠΊ «ΠΎΠ°Π·ΠΈΡ вдохновСния ΠΈ Ρ€Π°Π·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠΉ» для «ΠΊΠΎΡΠΌΠΎΠΏΠΎΠ»ΠΈΡ‚ΠΈΡ‡Π½ΠΎΠ³ΠΎ, нСзависимого, Π·Π½Π°Ρ‡ΠΈΠΌΠΎΠ³ΠΎ, Ρ‚ΠΎΠ»Π΅Ρ€Π°Π½Ρ‚Π½ΠΎΠ³ΠΎ, Π»ΠΈΠ±Π΅Ρ€Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ нонконформиста».

Рисунок 2 — ΠšΠΎΡ€ΠΏΠΎΡ€Π°Ρ‚ΠΈΠ²Π½Π°Ρ ΡΠ΅Ρ‚ΡŒ Decayenne

1.3 Evrika

Evrika — корпоративная ΡΠ΅Ρ‚ΡŒ для российских Π²Ρ€Π°Ρ‡Π΅ΠΉ. ΠŸΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ ΠΌΠ΅Π΄ΠΈΠ° — Π³Ρ€ΡƒΠΏΠΏΠ΅ «MedInform Healthcare Communications». ВсС страницы сайта, ΠΊΡ€ΠΎΠΌΠ΅ Π³Π»Π°Π²Π½ΠΎΠΉ, Π½Π΅ ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡ€ΡƒΡŽΡ‚ся поисковиками ΠΈ Π΄ΠΎΡΡ‚ΡƒΠΏΠ½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ зарСгистрированным ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ. Для получСния доступа Π½ΡƒΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ Π²Ρ€Π°Ρ‡ΠΎΠΌ, способным ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€Π΄ΠΈΡ‚ΡŒ свои ΠΏΡ€ΠΎΡ„Π΅ΡΡΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ знания ΠΈ Ρ„Π°ΠΊΡ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π² ΠΌΠ΅Π΄ΠΈΡ†ΠΈΠ½ΡΠΊΠΎΠΌ ΡƒΡ‡Ρ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΈ.

Π˜ΠΌΠ΅Π΅Ρ‚ΡΡ ΠΊΠ°ΠΊ ΡΠΎΡ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π°Ρ: ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, ΠΎΠ±ΠΌΠ΅Π½ ΠΊΠΎΠ½Ρ‚Π°ΠΊΡ‚Π°ΠΌΠΈ ΠΈ ΡΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΡΠΌΠΈ, Π³Ρ€ΡƒΠΏΠΏΡ‹, ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ; Ρ‚Π°ΠΊ ΠΈ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ ΠΏΠΎΡ€Ρ‚Π°Π»: мСдицинскиС новости, ΠΏΠ΅Ρ€Π΅ΠΏΠ΅Ρ‡Π°Ρ‚ΠΊΠΈ Π½Π°ΡƒΡ‡Π½Ρ‹Ρ… статСй ΠΈΠ· Ρ€ΠΎΡΡΠΈΠΉΡΠΊΠΈΡ… ΠΈ Π·Π°Ρ€ΡƒΠ±Π΅ΠΆΠ½Ρ‹Ρ… ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ², ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΌΠ΅Π΄ΠΈΠΊΠΎΠ² экспСртного уровня.

По Π½Π°ΡˆΠ΅ΠΌΡƒ мнСнию, сайт Π½Π°Ρ†Π΅Π»Π΅Π½ Π½Π° Π΄ΠΎΡ…ΠΎΠ΄Ρ‹ ΠΎΡ‚ ΠΏΡ€ΠΎΠ΄Π²ΠΈΠΆΠ΅Π½ΠΈΡ лСкарств, мСдоборудования ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΈΠ·Π΄Π΅Π»ΠΈΠΉ для здравоохранСния Π² ΠΏΡ€ΠΎΡ„Π΅ΡΡΠΈΠΎΠ½Π°Π»ΡŒΠ½ΡƒΡŽ срСду. Π­Ρ‚ΠΎ ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π°Π΅Ρ‚ Π΅Π³ΠΎ интСграция с Ρ€Π΅ΡΡƒΡ€ΡΠΎΠΌ «ΠœΠ΅Π΄ΠœΠ½Π΅Π½ΠΈΠ΅». ПослСдний Π² ΠΈΠ½Ρ‚СрСсах фармацСвтичСских ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΉ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ опросы срСди Π²Ρ€Π°Ρ‡Π΅ΠΉ ΠΈ ΠΏΠ»Π°Ρ‚ΠΈΡ‚ дСньги Π·Π° ΡƒΡ‡Π°ΡΡ‚ΠΈΠ΅ Π² Π½ΠΈΡ….

2. Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° web-прилоТСния

ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Π΄Π°Π½Π½ΠΎΠ³ΠΎ прилоТСния — ΠΎΡΠ½ΠΎΠ²ΠΎΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‰ΠΈΠ΅ части ΡΠΎΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ сСти: ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ° сообщСний, поиск Π΄Ρ€ΡƒΠ·Π΅ΠΉ, главная страница ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, Π±Π»ΠΎΠ³, ΠΎΠ±ΠΌΠ΅Π½ Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌΠΈ.

Π Π°Π½Π΅Π΅ ΡƒΠΆΠ΅ Π±Ρ‹Π» Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ сообщСний, поиска, добавлСния ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΡ Π΄Ρ€ΡƒΠ·Π΅ΠΉ ΠΈ Ρ‡Π°ΡΡ‚ΠΈΡ‡Π½ΠΎ главная страница ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Π’ Π΄Π°Π½Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Π΅ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° главная страница ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, осущСствлСн доступ ΠΊ Π΄Ρ€ΡƒΠ³ΠΈΠΌ страницам ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρ‹ сСбС Π½Π° ΡΡ‚Ρ€Π°Π½ΠΈΡ†Ρƒ ΠΈ ΡΠΊΠ°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ со ΡΡ‚Ρ€Π°Π½ΠΈΡ† Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, личная Π»Π΅Π½Ρ‚Π° новостСй ΠΈ ΡΡ‚Ρ€Π°Π½ΠΈΡ†Π° новостСй всСх ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, с Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ поиска новости ΠΏΠΎ ΡΠ»ΠΎΠ²Π°ΠΌ Π² Ρ‚СкстС ΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅, Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΡ ΠΏΠΎ Ρ‚Π΅Π³Π°ΠΌ ΠΈ ΠΏΠΎ Π΄Π°Ρ‚Π°ΠΌ.

Π’Π΅ΡΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» сайта Ρ€Π°Π·Π±ΠΈΡ‚ Π½Π° 3 прилоТСния profile, blog, message. ΠŸΠ΅Ρ€Π²ΠΎΠ΅ осущСствляСт ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π»ΠΈΡ‡Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, Π»Π΅Π½Ρ‚Ρƒ своих новостСй, созданиС Π½ΠΎΠ²ΠΎΠΉ новости, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² для скачивания Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ, поиск, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ. Π’Ρ‚ΠΎΡ€ΠΎΠ΅ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ новостСй для всСх ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, с Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ коммСнтирования. И ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π΅ Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅, ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° ΠΎΠ±ΠΌΠ΅Π½ сообщСниями ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌΠΈ.

КаТдоС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ состоит ΠΈΠ· Π΄Π²ΡƒΡ… частСй:

— ΠžΠ±Ρ‰Π΅Π΄ΠΎΡΡ‚упная Ρ‡Π°ΡΡ‚ΡŒ, которая Π΄Π°Π΅Ρ‚ людям Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ своим ΠΏΡ€ΠΎΡ„ΠΈΠ»Π΅ΠΌ.

— ΠΠ΄ΠΌΠΈΠ½ΠΈΡΡ‚ративная Ρ‡Π°ΡΡ‚ΡŒ, которая ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ администратору Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… сайта.

Π­Ρ‚ΠΈ Π΄Π²Π΅ части Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹, слСдуя ΡˆΠ°Π±Π»ΠΎΠ½Ρƒ МодСль-ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΠ΅-ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ (Model-View-Controller, MVC). ΠŸΡ€ΠΈΠΌΠ΅ΠΌ, Ρ‡Ρ‚ΠΎ MVC опрСдСляСт способ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΊΠΎΠ΄ для опрСдСлСния ΠΈ Π΄ΠΎΡΡ‚ΡƒΠΏΠ° ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ (модСль, Ρ„Π°ΠΉΠ» models. py) ΠΎΡ‚Π΄Π΅Π»Π΅Π½ ΠΎΡ‚ Π»ΠΎΠ³ΠΈΠΊΠΈ прилоТСния (ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅, Ρ„Π°ΠΉΠ» views. py), которая Π² ΡΠ²ΠΎΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΎΡ‚Π΄Π΅Π»Π΅Π½Π° ΠΎΡ‚ ΠΈΠ½Ρ‚СрфСйса ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ (прСдставлСниС, Ρ„Π°ΠΉΠ» html) Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ модификация ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² ΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ минимальноС воздСйствиС Π½Π° ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅.

Основой ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π±ΡƒΠ΄ΡƒΡ‚ manage. py, __init__.py, settings. py, urls. py, wsgi.py.

— manage. py ΡΠΊΡ€ΠΈΠΏΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт Π²Π°ΠΌ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ с ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ Django.

— __init__.py пустой Ρ„Π°ΠΉΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Python, Ρ‡Ρ‚ΠΎ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ являСтся ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠΌ Python.

— settings. py Π½Π°ΡΡ‚Ρ€ΠΎΠΉΠΊΠΈ / конфигурация ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.

— urls. py ΠΊΠΎΠ½Ρ„игурация URL-ΠΎΠ² для вашСго ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Django. Π­Ρ‚ΠΎ «ΡΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅» всСх Django-сайтов.

— wsgi. py Ρ‚ΠΎΡ‡ΠΊΠΈ Π²Ρ…ΠΎΠ΄Π° для WSGI-совмСстимый Π²Π΅Π±-сСрвСров.

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ этих Ρ„Π°ΠΉΠ»ΠΎΠ² прСдставлСно Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ А.

Π’ Π΄Π°Π½Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Π΅ ΠΏΠΎΠΌΠΈΠΌΠΎ модуля django-registration, Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ south, для осущСствлСния ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, grapelli, для придания административной части красивого Π²ΠΈΠ΄Π°, filebrowser, для мноТСствСнной Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ².

3. Π‘Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Π°Π΄ΠΌΠΈΠ½ΠΈΡΡ‚ративная Ρ‡Π°ΡΡ‚ΡŒ

Π’ ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ Π‘Π£Π‘Π” Π²Ρ‹Π±Ρ€Π°Π½Π° PostgreSQL, Π² ΡΠ²ΡΠ·ΠΈ с Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ΠΌ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… особСнностСй Π² PostgreSQL, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ — внСшниС ΠΊΠ»ΡŽΡ‡ΠΈ, Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€Ρ‹ ΠΈ ΠΏΡ€Π΅Π΄ΡΡ‚авлСния. Они ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΡΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΡ‚ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ избСгая создания слоТных ΠΊΠΎΠΌΠ°Π½Π΄ SQL. ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… осущСствляСтся Π² ΠΏΠ°ΠΏΠΊΠ΅ settings (Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ Ρ€Π°Π±ΠΎΡ‚Π΅ всС настройки Π½Π°Ρ…ΠΎΠ΄ΠΈΠ»ΠΈΡΡŒ Π² ΠΎΠ΄Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ settings. py).

DATABASE = {

'default': {

'ENGINE': 'django.db.backends.postgresql_psycopg2',

'NAME': 'diplom',

'USER': 'postgres',

'PASSWORD':'postgres',

'HOST': '127.0.0.1',

'PORT': '5432',

}

}

Π­Ρ‚Π° настройка вСдСтся с ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π² PostgreSQL ΠΌΡ‹ ΡƒΠΆΠ΅ создали ΠΏΡƒΡΡ‚ΡƒΡŽ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… с Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ diplom.

Рассмотрим ΠΌΠΎΠ΄Π΅Π»ΡŒΠ½ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ прилоТСния, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰ΡƒΡŽ Π·Π° Π³Π»Π°Π²Π½ΡƒΡŽ страницу ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

Класс Profile описываСт структуру Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ profile, которая ссылаСтся Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ User, (ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ ΠΏΡ€ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ прилоТСния django.contrib.auth), с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ поля user (ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса ForeignKey, Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚-ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ модСль User).

user = models. ForeignKey (User, related_name='profile', verbose_name = ('User'), blank = True, null=True)

Π’Π°ΠΊ ΠΆΠ΅ Π² ΡΡ‚ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ описаны Π΄Π²Π° поля friends ΠΈ friesnd_requests, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ класса ManyToManyField (ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ ΠΌΠ½ΠΎΠ³ΠΈΠ΅-ΠΊΠΎ-ΠΌΠ½ΠΎΠ³ΠΈΠΌ) ΠΈ ΡΡΡ‹Π»Π°ΡŽΡ‚ся Π½Π° ΡΠ²ΠΎΡŽ ΠΆΠ΅ модСль («self»), для опрСдСлСния, ΠΊΠ°ΠΊΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Profile находятся Π² Π΄Ρ€ΡƒΠ·ΡŒΡΡ… ΠΈ ΠΊΡ‚ΠΎ хочСтся ΡΡ‚Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΌ.

friends = models. ManyToManyField («self», blank=True, null=True, symmetrical = False, related_name='friends_targets')

friend_requests = models. ManyToManyField («self», blank=True, null=True, symmetrical = False, related_name='friend_requests_targets')

ПолС party Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ для администратора, Ρ‡Ρ‚ΠΎ Π±Ρ‹ ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ являСтся сотрудником Ρ„ΠΈΡ€ΠΌΡ‹, ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ Π΅Π³ΠΎ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚. Если ΠΌΠΎΠ΄ΡƒΠ»ΡŒ django-registration, обСспСчиваСт ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ Π½Π° Ρ€Π΅Π³ΠΈΡΡ‚Ρ€Π°Ρ†ΠΈΡŽ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ°, Ρ‚ΠΎ ΠΏΠΎΠ»Π΅ party Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Ρ‹Ρ‡Π°Π³ΠΎΠΌ администратора, для добавлСния Π² ΡΠΎΡ†ΠΈΠ°Π»ΡŒΠ½ΡƒΡŽ ΡΠ΅Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ сотрудников Ρ„ΠΈΡ€ΠΌΡ‹. Волько послС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ администратор свяТСтся с Π·Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ ΠΈ ΡƒΠ±Π΅Π΄ΠΈΡ‚ся, Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‚ являСтся участником, ΠΎΠ½ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΡƒΠ΅Ρ‚ Π΅Π³ΠΎ Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚ Ρ‡Π΅Ρ€Π΅Π· Π°Π΄ΠΌΠΈΠ½ΠΈΡΡ‚Ρ€Π°Ρ‚ΠΈΠ²Π½ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ, ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ смоТСт ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ сайтом.

party = models. BooleanField (u'ЯвляСтся участником сообщСства', blank=True, default = False)

ПолС для Ρ„ΠΎΡ‚ΠΎΠ³Ρ€Π°Ρ„ΠΈΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΎ Π² ΡΡ‚ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Π΅ Π½Π° FileBrowserField. Π­Ρ‚ΠΎΡ‚ класс прСдоставляСт Π½Π°ΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ сразу нСсколько Ρ„Π°ΠΉΠ»ΠΎΠ², Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ΅ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ (рисунок 3).

Рисунок 3 — Административная Ρ‡Π°ΡΡ‚ΡŒ ΠΌΠΎΠ΄Π΅Π»ΠΈ Profile

ΠžΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ поля ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ: имя, Ρ„Π°ΠΌΠΈΠ»ΠΈΡŽ, отчСство ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΊΠΎΠ½Ρ‚Π°ΠΊΡ‚Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅.

Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎ Π±Ρ‹ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ для скачивания Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ, создаСм Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ модСль FileProfile (рисунок 4).

Рисунок 4 — Административная Ρ‡Π°ΡΡ‚ΡŒ ΠΌΠΎΠ΄Π΅Π»ΠΈ FileProfile

Π­Ρ‚Π° модСль содСрТит ΠΏΠΎΠ»Π΅ для Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° file (FileBrowserField), Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒΡΡ Ρ„Π°ΠΉΠ» ΠΏΡ€ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ Π΅Π³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ. Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎ Π±Ρ‹ ΠΏΠΎΠ»Π΅ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π»ΠΎ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ `format' строковым Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ `document'. Π’ΠΎΠ³Π΄Π° ΠΏΠΎΠ»Π΅ смоТСт ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρ‹ '.pdf', '.doc', '.rtf', '.txt', '.xls', '.csv'.

file = FileBrowseField (u «Π€Π°ΠΉΠ»», directory='uploads/files/', max_length=100, format = 'document', null=True, blank=True)

ПолС user (ForeignKey), ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ автоматичСски, ΠΏΡ€ΠΈ сохранСнии ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΌΠΎΠ΄Π΅Π»ΠΈ, Π·Π°ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ ΠΌΠΎΠ΄Π΅Π»ΠΈ Profile Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

user = models. ForeignKey (Profile, related_name='profile', verbose_name=('User'), blank=True, null=True)

Π’Π°ΠΊ ΠΆΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π΄Π²Π° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… поля title ΠΈ date соотвСтствСнно CharField ΠΈ DateTimeField.

title = models. CharField (u «Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ», max_length=64, blank=True, null=True)

date = models. DateTimeField (verbose_name=u'Π”Π°Ρ‚Π° Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Ρ„Π°ΠΉΠ»Π°', blank=True, null=True, default = datetime.datetime.now)

ПослС сохранСния Ρ„Π°ΠΉΠ»Π° models. py Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ profile, Π½Π°Π΄ΠΎ Ρ‡Ρ‚ΠΎ Π±Ρ‹ Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π»Π°ΡΡŒ описанныС Π½Π°ΠΌΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ. Π’ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ Ρ€Π°Π±ΠΎΡ‚Π΅ я ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π»Π° ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ django — syncdb, которая ΠΌΠΎΠΆΠ΅Ρ‚ с Π½ΡƒΠ»Ρ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ, Π½ΠΎ Π½Π΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ с Π½Π΅ΠΉ Π² Π΄Π°Π»ΡŒΠ½Π΅ΠΉΡˆΠ΅ΠΌ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ. Π’. Π΅. Ссли я ΠΈΠ·ΠΌΠ΅Π½ΡΠ»Π° ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ поля ΠΌΠ½Π΅ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ всю Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ, зависимыС Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, ΠΈ Π²ΡΠ΅ ΠΈΡ… Π΄Π°Π½Π½Ρ‹Π΅ для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎ Π±Ρ‹ просто Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ поля. Иногда Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ, Π² PostgreSQL создавала ΠΈΠ»ΠΈ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π»Π° поля, Π½ΠΎ ΠΏΡ€ΠΈ добавлСния поля-связи (ManyToManyField, ForeignKey ΠΈ Ρ‚. Π΄.) ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΆΠ΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π»ΠΈ трудности. Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎ Π±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ всСго этого устанавливаСм ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ south, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ осущСствляСт Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚Π°Π±Π»ΠΈΡ† Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄ schemamigration ΠΈ migrate. Если ΠΌΡ‹ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Ρ€Π°Π· Π΄Π΅Π»Π°Π΅ΠΌ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΡŽ, Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ schemamigration с ΠΊΠ»ΡŽΡ‡Ρ‘ΠΌ — initial:

>python manage. py schemamigration profile — initial

ПослС этой ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ создастся ΠΏΠ°ΠΏΠΊΠ° migrations, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ сформируСтся Ρ„Π°ΠΉΠ» c Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ. py, ΠΏΡ€ΠΈ запускС ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ migrate, выполнятся питоновскиС скрипты ΠΈ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄ΡƒΡ‚ измСнСния Π² Π½Π°ΡˆΠ΅ΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Π΅:

>python manage. py migrate profile

Π’ Π΄Π°Π»ΡŒΠ½Π΅ΠΉΡˆΠ΅ΠΌ ΠΏΡ€ΠΈ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΏΠΎΠ»Π΅ΠΉ Π² ΡΡ‚ΠΎΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π΅ ΠΆΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, Π½ΠΎ ΡƒΠΆΠ΅ с ΠΊΠ»ΡŽΡ‡ΠΎΠΌ — auto.

ΠŸΡ€ΠΈ создании ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… Ρ‚Π°Π±Π»ΠΈΡ† Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Π±ΡƒΠ΄Π΅ΠΌ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ south.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ ΠΊ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ blog, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ содСрТит ΠΌΠΎΠ΄Π΅Π»ΠΈ Blog, Tags ΠΈ Comment, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…. МодСль Blog (рисунок 6) ссылаСтся Π½Π° ΠΌΠΎΠ΄Π΅Π»ΡŒ Tags (рисунок 5) с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ поля tags, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ являСтся экзСмпляром класса ManyToManyField. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ ΠΌΠΎΠ΄Π΅Π»ΠΈ Blog Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ мноТСство ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΌΠΎΠ΄Π΅Π»ΠΈ Tags.

tags = models. ManyToManyField (Tags, verbose_name=u'Π’Π΅Π³ΠΈ', blank=True)

Рисунок 5 — Административная Ρ‡Π°ΡΡ‚ΡŒ ΠΌΠΎΠ΄Π΅Π»ΠΈ Tags

Рисунок 6 — Административная Ρ‡Π°ΡΡ‚ΡŒ ΠΌΠΎΠ΄Π΅Π»ΠΈ Blog

МодСль Comment (рисунок 7) Π±ΡƒΠ΄Π΅Ρ‚ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° ΠΌΠΎΠ΄Π΅Π»ΡŒ Blog с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ связи ForeignKey.

Рисунок 7 — Административная Ρ‡Π°ΡΡ‚ΡŒ ΠΌΠΎΠ΄Π΅Π»ΠΈ Comment

Π­Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎ Π±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ относятся ΠΊ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ новости. ΠŸΡ€ΠΈ создании этих Ρ‚Ρ€Ρ‘Ρ… ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Ρ‚Π°ΠΊΠΆΠ΅ Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ поля:

Blog: zagol, author — (ΠΎΠ±ΡŒΠ΅ΠΊΡ‚ класса CharField) Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ новости ΠΈ ΠΈΠΌΡ Π°Π²Ρ‚ΠΎΡ€Π°, image — (ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса FileBrowseField) ΠΎΠ±Π»ΠΎΠΆΠΊΠ° новости, date_of_publication — (DateTimeField) Π΄Π°Ρ‚Π° ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ устанавливаСтся Π² Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ Π΄Π°Ρ‚Ρƒ создания), ΠΈ text — (TextField) тСкст новости;

Tags: name — (CharField) Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Ρ‚Π΅Π³Π°;

Comment: author_name — (CharField) имя Π°Π²Ρ‚ΠΎΡ€Π° коммСнтария, text — (TextField) тСкст коммСнтария, pub_date — (DateTimeField) Π΄Π°Ρ‚Π° ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ коммСнтария, admin_comment — (BooleanField) устанавливаСтся Π² True администратором, Ссли ΠΎΠ½ ΠΎΠ΄ΠΎΠ±Ρ€ΡΠ΅Ρ‚ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ;

Для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ€Π°Π·Π΄Π΅Π»Π° Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π― создаСм Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ messages. Π€Π°ΠΉΠ» models. py Π΄Π»Ρ этого прилоТСния Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΌΠΎΠ΄Π΅Π»ΠΈ Message ΠΈ Chat, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡ‚ΡŒ ΠΎΠ±ΠΌΠ΅Π½ΠΈΠ²Π°Ρ‚ΡŒΡΡ сообщСниями ΠΌΠ΅ΠΆΠ΄Ρƒ Π΄Ρ€ΡƒΠ·ΡŒΡΠΌΠΈ ΡΠΎΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ сСти.

МодСль Message содСрТит Π΄Π²Π° поля sender ΠΈ recipient (ForeignKey), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΡΡ‹Π»Π°ΡŽΡ‚ΡΡ Π½Π° ΠΌΠΎΠ΄Π΅Π»ΡŒ User, ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚, ΠΊΡ‚ΠΎ ΠΈΠ· ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ отправляСт сообщСниС, Π° ΠΊΡ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ (рисунок 8).

Рисунок 8 — Административная Ρ‡Π°ΡΡ‚ΡŒ ΠΌΠΎΠ΄Π΅Π»ΠΈ Message

МодСль Chat слуТит для объСдинСния Π² ΠΎΠ΄ΠΈΠ½ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ всСх ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈΠ· ΠΌΠΎΠ΄Π΅Π»ΠΈ Message, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚Π΅Π»ΡŒ ΠΈΠ»ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚Π΅Π»ΡŒ соотвСтствуСт полям person1 ΠΈ person2, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π² ΡΠ²ΠΎΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΡΡΡ‹Π»Π°ΡŽΡ‚ΡΡ Π½Π° ΠΌΠΎΠ΄Π΅Π»ΡŒ User (рисунок 9).

Рисунок 9 — Административная Ρ‡Π°ΡΡ‚ΡŒ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π‘hat

ПолС messages — экзСмпляр класса ManyToManyField ΠΈ ΡΡΡ‹Π»Π°Π΅Ρ‚ся Π½Π° ΠΌΠΎΠ΄Π΅Π»ΡŒ Message. Π’. Π΅. ΠΎΠ΄ΠΈΠ½ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Chat Π±ΡƒΠ΄Π΅Ρ‚ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΌΠΎΠ΄Π΅Π»ΠΈ Message.

Π’Π°ΠΊ ΠΆΠ΅ эти Π΄Π²Π΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ поля date — Π΄Π°Ρ‚Π° создания сообщСния (DateTimeField), title — Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ сообщСния (CharField), message — тСкст сообщСния (TextField), reader — булСвскоС ΠΏΠΎΠ»Π΅ для установлСния, ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½ΠΎ Π»ΠΈ сообщСниС ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚Π΅Π»Π΅ΠΌ ΠΈΠ»ΠΈ Π½Π΅Ρ‚ (BooleanField).

ВсС ΠΌΠΎΠ΄Π΅Π»ΠΈ прСдставлСны Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π‘ Π² Ρ€Π°Π·Π΄Π΅Π»Π°Ρ… ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Ρ„Π°ΠΉΠ»Π°ΠΌ models.py.

4. Class-Base-View

Π’Π΅ΡΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» сайта Π±Ρ‹Π» пСрСписан, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Class-Base-View (CBV), способ описания view с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ классов, Π² ΡΠ²ΡΠ·ΠΈ с Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ΠΌ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π°. Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎΠΎΠ±Ρ€Π°Π·Π½Ρ‹ΠΉ ΠΊΠΎΠ΄, ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ view описаны прямо Π² ΠΊΠΎΠ΄Π΅ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ°.

Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ Π² ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΡ… классов ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ стандартныС классы ListView, DetailView, TemplateView, View, CreateView ΠΈ MonthArchiveView.

Класс TemplateView позволяСт ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ шаблон, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ Π² Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π΅ template_name. Π§Ρ‚ΠΎ Π±Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹ΠΉ Π² Π·Π°ΠΏΡ€ΠΎΡΠ΅ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ get_context_data ΠΈ Π² Π½Π΅ΠΌ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π² ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ context всС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Π½Π°ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹.

Класс ListView обСспСчиваСт Π²Ρ‹Π²ΠΎΠ΄ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² Π²ΠΈΠ΄Π΅ списка. Π’ ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ основных Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ model — для указания, ΠΈΠ· ΠΊΠ°ΠΊΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, template_name — для явного указания ΠΊΠ°ΠΊΠΎΠΉ Π² ΠΊΠ°ΠΊΠΎΠΉ шаблон Π±ΡƒΠ΄Π΅ΠΌ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ. Π₯отя Ссли явно Π½Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ этот Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚, Django «Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚» Π΅Π³ΠΎ ΠΈΠ· Π½Π°Π·Π²Π°Π½ΠΈΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС, Ρ‚Π°ΠΊΠΈΠΌ «Π²Ρ‹Ρ‡ΠΈΡΠ»Π΅Π½Π½Ρ‹ΠΌ» шаблоном Π±ΡƒΠ΄Π΅Ρ‚ «APP/MODEL_list.html» — Ρ‡Π°ΡΡ‚ΡŒ «APP» бСрСтся ΠΈΠ· ΠΈΠΌΠ΅Π½ΠΈ прилоТСния, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰Π΅Π³ΠΎ модСль, Π° Ρ‡Π°ΡΡ‚ΡŒ «MODEL» — это просто Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π² Π½ΠΈΠΆΠ½Π΅ΠΌ рСгистрС.

Класс DetailView позволяСт ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, id ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρƒ pk, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒΡΡ Π² url. Π’Π°ΠΊ ΠΆΠ΅ основным Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ являСтся model, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π°ΡˆΡƒ модСль, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚.

Класс View ΡƒΠΌΠ΅Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ свои Ρ„ΡƒΠ½Ρ†ΠΈΠΈ get (), post () ΠΈ Ρ‚. ΠΏ. Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΠΈ ΠΎΡ‚ Ρ‚ΠΈΠΏΠ° запроса, пСрСдавая request.

Класс CreateView осущСствляСт созданиС Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Основной ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ ΠΆΠ΅ являСтся model. ΠŸΡ€ΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ Ρ„ΠΎΡ€ΠΌΡ‹, Ссли Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Ρ‡Ρ‚ΠΎ Π±Ρ‹ ΡΠΎΡ…Ρ€Π°Π½ΡΠ»ΠΈΡΡŒ ΠΊΠ°ΠΊΠΈΠ΅-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ поля ΠΈΠ»ΠΈ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π½Π΅Π½ΡƒΠΆΠ½Ρ‹Π΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ fields ΠΈ exclude, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ списки ΠΏΠΎΠ»Π΅ΠΉ.

MonthArchiveView — класс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΠΎΠ»Π΅, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰Π΅Π΅ Π·Π° Π΄Π°Ρ‚Ρƒ создания, соотвСтствуСт мСсяцу ΠΈ Π³ΠΎΠ΄Ρƒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Π² url. Для этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ date_field ΠΈ queryset.

5. ЛогичСская Ρ‡Π°ΡΡ‚ΡŒ прилоТСния ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° ΡΡ‚Ρ€Π°Π½ΠΈΡ†Π°Ρ…

Π’Π΅ΠΏΠ΅Ρ€ΡŒ приступим ΠΊ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π° Π½Π°ΡˆΠΈΡ… страниц.

Главная страница сайта Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ собой страницу профиля ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, Π³Π΄Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Ρ‹ Π΅Π³ΠΎ ΠΊΠΎΠ½Ρ‚Π°ΠΊΡ‚Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅, Π½ΠΎΠ²ΠΎΡΡ‚Π½ΡƒΡŽ Π»Π΅Π½Ρ‚Ρƒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, с Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ новости, ΠΈ Ρ„ΠΎΡ€ΠΌΡƒ для выкладывания Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΈ ΡΠΏΠΈΡΠΎΠΊ для ΠΈΡ… ΡΠΊΠ°Ρ‡ΠΈΠ²Π°Π½ΠΈΡ (рисунок 10).

Для этого создадим класс ProfileView, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ ΠΊΠ»Π°ΡΡΠ° CreateView. Но Π² ΡΠ²ΡΠ·ΠΈ с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π½Π° ΡΡ‚Ρ€Π°Π½ΠΈΡ†Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ мноТСство дСйствий, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ view, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ класс. ΠœΠ΅Ρ‚ΠΎΠ΄ get_context_data Π±ΡƒΠ΄Π΅Ρ‚ ΡΡ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ GET запросС, ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Π΄Π²Π΅ Ρ„ΠΎΡ€ΠΌΡ‹ (для создания новости ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°). Π’Π°ΠΊ ΠΆΠ΅ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ view ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ:

if (self.request.user.is_authenticated ()) and (Profile.objects.get (pk= self.request.user.id).party == True) and (not 'pk' in self. kwargs)

Π­Ρ‚ΠΎΡ‚ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ опрСдСлят, зарСгистрирован Π»ΠΈ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ, Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Π½ Π»ΠΈ ΠΎΠ½ Π°Π΄ΠΌΠΈΠ½ΠΈΡΡ‚Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ ΠΈ Π½Π°Ρ…одится Π»ΠΈ Π½Π° ΡΠ²ΠΎΠ΅ΠΉ страницС ΠΈΠ»ΠΈ Π½Π° ΡΡ‚Ρ€Π°Π½ΠΈΡ†Π΅ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

Рисунок 10 — Главная страница ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ

Π€ΠΎΡ€ΠΌΡ‹ для создания новости BlogForm ΠΈ Π΄Π»Ρ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Ρ„Π°ΠΉΠ»Π° FileForm опишСм Π² Ρ‚ΠΎΠΉ ΠΆΠ΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ Π² Ρ„Π°ΠΉΠ»Π΅ forms.py.

ΠŸΠ΅Ρ€Π²ΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒ ΡƒΠΊΠ°ΠΆΠ΅ΠΌ ΠΊΠ°ΠΊ стандартный Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ класса form_class. И ΠΏΡ€ΠΈ срабатывании POST запроса, эта Ρ„ΠΎΡ€ΠΌΠ° Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒΡΡ стандартными ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ CreateView. Π§Ρ‚ΠΎ Π±Ρ‹ Π½Π΅ ΠΏΡ€ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ Π»ΠΈΡˆΠ½ΠΈΡ… ΠΏΠΎΠ»Π΅ΠΉ Π² Ρ„ΠΎΡ€ΠΌΠ΅ BlogForm, ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ класс ModelForm, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°ΠΆΠ΅Ρ‚ Ρ‡Ρ‚ΠΎ Ρ„ΠΎΡ€ΠΌΠ° Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ ΠΌΠΎΠ΄Π΅Π»ΠΈ Blog, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° model, ΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρƒ exclude ΡƒΠΊΠ°ΠΆΠ΅ΠΌ ΠΊΠ°ΠΊΠΈΠ΅ поля ΠΌΡ‹ Π½Π΅ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ.

class BlogForm (forms. ModelForm):

class Meta:

model = Blog

exclude = ('number', 'author', 'date_of_publication', 'image', 'tags')

thumbnail = forms. FileField (max_length=200, label= «ΠžΠ±Π»ΠΎΠΆΠΊΠ° новости», required=False)

Π’. ΠΊ. Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Ρ‡Ρ‚ΠΎ Π±Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π΅ Π²ΠΈΠ΄Π΅Π» тСхничСскиС поля (Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ author, date_of_publication, number, ΠΏΠΎΠ»Π΅ tags прСдставляСт собой ссылку Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ (ManyToManyField), ΠΏΠΎΠ»Π΅ image — FileBrowserField Π½Π΅ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚авляСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Ρ„Π°ΠΉΠ»Π° Π½Π° ΡΡ‚Π°Π½ΠΈΡ†Π΅ сайта) Ρ‚ΠΎ ΠΈΡ… ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΈ Π·Π°ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ Π²ΠΎ Π²Ρ€Π΅ΠΌΡ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π½Π° Π²Π°Π»ΠΈΠ΄Π½ΠΎΡΡ‚ΡŒ Ρ„ΠΎΡ€ΠΌΡ‹.

Π§Ρ‚ΠΎ ΠΆΠ΅ касаСтся Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΡ‹, FileForm, Ρ‚ΠΎ ΠΌΡ‹ Π΅Π΅ Π±ΡƒΠ΄Π΅ΠΌ просто ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π² ΡΠ»ΠΎΠ²Π°Ρ€Π΅ context вмСстС с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ Π½ΡƒΠΆΠ½Ρ‹ΠΌΠΈ Π½Π°ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ, ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ класса UploadView, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΠΎΠ³ΠΎ класса View, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ post, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ.

class FileForm (forms. ModelForm):

class Meta:

model = FileProfile

exclude = ('user', 'date', 'file')

doc = forms. FileField (max_length=200, label= «Π€Π°ΠΉΠ»», required=False)

Π₯ΠΎΡ‡Ρƒ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ новости ΠΈΠ»ΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° для скачивания, Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ… использовалось Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ»Π΅ FileField. Π­Ρ‚ΠΎ связано с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» поля FielBrowserField Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» Π½Π° ΡΡ‚Ρ€Π°Π½ΠΈΡ†Π΅ сайта, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹Ρ… Django-ΠΏΠΎΠ»Π΅ΠΉ ImageField ΠΈ FileField, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ описано Π² Ρ„ΠΎΡ€ΠΌΠ΅. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΏΡ€ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π΅ Π½Π° ΡˆΠ°Π±Π»ΠΎΠ½ (Ρ„Π°ΠΉΠ» *.html), ΠΌΡ‹ ΡΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ ΠΏΠΎΠ»Π΅ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Blog ΠΈ FileProfile, Π° Π²ΠΌΠ΅ΡΡ‚ΠΎ Π½ΠΈΡ… ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΏΠΎΠ»Π΅ FileField. И ΡƒΠΆΠ΅ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, ΠΌΡ‹ ΠΈΠ· POST запроса ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ„Π°ΠΉΠ»Π°, сохраняСм Π΅Π³ΠΎ ΠΏΠΎ Π½ΡƒΠΆΠ½ΠΎΠΌΡƒ Π½Π°ΠΌ ΠΏΡƒΡ‚ΠΈ ΠΈ Ρ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° FileObject, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ импортируСтся ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ filebrowser, ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅ΠΌ Π΅Π³ΠΎ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса FileBrowserField.

Π’Π΅ΡΡŒ ΠΊΠΎΠ΄ Π΄Π°Π½Π½Ρ‹Ρ… страниц прСдставлСн Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π‘.

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰Π΅Π΅ Ρ€Π°Π·Π΄Π΅Π» Π‘Π›ΠžΠ“, описываСтся Π² ΠΏΠ°ΠΏΠΊΠ΅ blog нашСго ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. Основная страница этого Ρ€Π°Π·Π΄Π΅Π»Π° прСдставляСт собой Π»Π΅Π½Ρ‚Ρƒ новостСй, с Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ Π½ΠΎΠ²ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ, Ρ„ΠΎΡ€ΠΌΠΎΠΉ поиска ΠΏΠΎ ΡΠ»ΠΎΠ²Π°ΠΌ Π² Ρ‚СкстС, Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ ΠΈ Ρ‚Π΅Π³Π°ΠΌ новости, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π±ΠΎΠΊΠΎΠ²ΠΎΠ΅ мСню, для Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΠΈ новостСй ΠΏΠΎ Π°Ρ€Ρ…ΠΈΠ²Π°ΠΌ (рисунок 11).

Рисунок 11 — Главная страница новостСй

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» Π³Π»Π°Π²Π½ΠΎΠΉ страницы новостСй осущСствляСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ класса ListView, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ Π² ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° model модСль Blog, Ρ‡Ρ‚ΠΎ Π±Ρ‹ вывСсти всС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π΄Π°Π½Π½ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ.

class BlogList (ListView):

model = Blog

context_object_name = «blog»

def get_context_data (self, **kwargs):

context = super (BlogList, self).get_context_data (**kwargs)

if self.request.user.is_authenticated () and Profile.objects.get (pk=self.request.user.id).party==True:

date_obj = []

for obj in Blog.objects.dates ('created', 'month'):

date_obj.append (obj)

context['archives'] = date_obj

context ['active_main_menu']='main_blog'

else:

self.template_name = «profile/error.html»

context['ErrorText'] = u «Π’Ρ‹ Π½Π΅ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹»

return context

Для просмотра ΠΊΠ°ΠΆΠ΄ΠΎΠΉ новости создаСм класс BlogDetail, Π° Π² ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ родитСля класса Π±ΡƒΠ΄Π΅ΠΌ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ CreateView, Ρ‡Ρ‚ΠΎ Π±Ρ‹ Π±Ρ‹Π»Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ. Атрибуту model Π·Π°Π΄Π°Π΅ΠΌ ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΌΠΎΠ΄Π΅Π»ΠΈ Blog, указывая Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΠΊΠ°ΠΊΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ, ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Ρ„ΠΎΡ€ΠΌΡƒ, Π° Π² Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π΅ exclude ΡƒΠΊΠ°ΠΆΠ΅ΠΌ ΠΊΠ°ΠΊΠΈΠ΅ поля, ΠΌΡ‹ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ Π½Π° ΡˆΠ°Π±Π»ΠΎΠ½Π΅.

model = Comment

exclude = ['article', 'author_name', 'pub_date', 'admin_comment']

И Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ, Ρ‡Ρ‚ΠΎ Π±Ρ‹ ΠΏΡ€ΠΈ сохранСнии ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° наши ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹Π΅ поля Ρ‚ΠΎΠΆΠ΅ ΠΏΡ€ΠΈΠΎΠ±Ρ€Π΅Π»ΠΈ Π½ΡƒΠΆΠ½Ρ‹Π΅ Π½Π°ΠΌ значСния, ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ form_valid:

def form_valid (self, form):

instance = form. save (commit=False)

instance.article = Blog.objects.get (pk=self.kwargs['pk'])

instance.author_name = self.request.user.username

instance.pub_date = datetime.datetime.now ()

instance.save ()

return redirect (self.get_absolute_url ())

def get_absolute_url (self):

return reverse («blog_detail», kwargs={"pk": self. kwargs['pk']})

Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎ Π±Ρ‹ наши ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΌΠΎΠ΄Π΅Π»ΠΈ Blog Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ²Π°Π»ΠΈΡΡŒ ΠΏΠΎ Π΄Π°Ρ‚Π°ΠΌ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ Π² Π±ΠΎΠΊΠΎΠ²ΠΎΠΌ мСню, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ класс MonthArchiveView. Π­Ρ‚ΠΎΡ‚ класс ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠΌ date_field, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰Π΅Π³ΠΎ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΏΠΎΠ»Π΅ Ρ‚ΠΈΠΏΠ° DateTimeField Π² Π²ΠΈΠ΄Π΅ строки, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π±ΡƒΠ΄Π΅ΠΌ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹. ΠŸΡ€ΠΈ этом Π² url Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒΡΡ Π΄Π²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° — month, year, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ мСсяцу ΠΈ Π³ΠΎΠ΄Ρƒ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ Π² ΡΡΡ‹Π»ΠΊΠ΅.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π’ Π΄ΠΈΠΏΠ»ΠΎΠΌΠ½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Class-Base-View Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΡΠ²Π»ΡΡŽΡ‰Π΅Π΅ΡΡ ΠΊΠΎΡ€ΠΏΠΎΡ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ ΡΠ΅Ρ‚ΡŒΡŽ для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ ККМОО «ΠœΠΎΠ»ΠΎΠ΄Π΅ΠΆΠ½Π°Ρ Π»ΠΈΠ³Π° развития Π½Π°Ρ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΊΡƒΠ»ΡŒΡ‚ΡƒΡ€ ΠšΡƒΠ±Π°Π½ΠΈ», сгСнСрирована Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… Π² PostgeSQL Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΠΏΠΎΠ»Π΅ΠΉ описанных Π² ΠΌΠΎΠ΄Π΅Π»ΡΡ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, c ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ модуля south. ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ осущСствляСт ΠΎΠ±ΠΌΠ΅Π½ сообщСниями, поиск, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΡ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ Π² Π΄Ρ€ΡƒΠ·ΡŒΡ, новостной Π±Π»ΠΎΠ³, с Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ коммСнтирования ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠΈ ΠΈ Π»ΠΈΡ‡Π½ΡƒΡŽ страницу ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽ Π»ΠΈΡ‡Π½ΡƒΡŽ Π»Π΅Π½Ρ‚Ρƒ новостСй, список Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² для скачивания ΠΈ ΠΊΠΎΠ½Ρ‚Π°ΠΊΡ‚Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ для ΠΊΡ€ΡƒΠΏΠ½Ρ‹Ρ… Ρ„ΠΈΡ€ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ постоянный ΠΈ Π±Ρ‹ΡΡ‚Ρ€Ρ‹ΠΉ ΠΎΠ±ΠΌΠ΅Π½ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, ΠΏΡ€ΠΈ этом минимизируя ΡƒΡ‚Π΅Ρ‡ΠΊΡƒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ Π΄Π°Π½Π½ΠΎΠ³ΠΎ сообщСства. Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ прСдставляСт собой Π‘Π°ΠΉΡ‚-ΠΏΠΎΠ΄-ΠΊΠ»ΡŽΡ‡, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ ΠΈ ΠΏΡ€ΠΈ этом Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΉ административной Ρ‡Π°ΡΡ‚ΡŒΡŽ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½Ρ‹ΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ, Ρ‡Ρ‚ΠΎ позволяСт Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Ρƒ сайта Π½Π΅ Π½Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒ постоянного администратора.

ΠŸΠ»Π°Π½ΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ дальнСйшСС Ρ€Π°Π·Π²ΠΈΡ‚ΠΈΠ΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° — Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ„ΠΎΡ‚ΠΎΠΈ Π²ΠΈΠ΄Π΅ΠΎ — Π³Π°Π»Π΅Ρ€Π΅ΠΈ, Π° Ρ‚Π°ΠΊΠΆΠ΅, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ API ЯндСкс. translate ΠΈ API ЯндСкс. ΠšΠ°Ρ€Ρ‚Ρ‹, Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ всСго сайта ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΡ Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ мСстности Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… графичСских ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².

Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ ΡƒΡ‚Ρ€Π°Ρ‚ΠΈΡ‚ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Π² Π΄Π°Π»ΡŒΠ½Π΅ΠΉΡˆΠ΅ΠΌ Π³ΠΎΡ€Π°Π·Π΄ΠΎ ΠΏΠΎΠ»Π΅Π·Π½Π΅Π΅.

Π’Π΅ΡΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ написан Π½Π° ΡΠ·Ρ‹ΠΊΠ΅ Python.

Бписок ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ Π»ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΡƒΡ€Ρ‹

1 Django 1.5 documentation [Π­Π»Π΅ΠΊΡ‚Ρ€ΠΎΠ½Π½Ρ‹ΠΉ рСсурс] // Django 1.5 documentation. URL: https://docs.djangoproject.com/en/1.5/. (Π”Π°Ρ‚Π° обращСния: 1.09.2013)

2 Π€ΠΎΡ€ΡΡŒΠ΅, Π”ΠΆ. Django. Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π²Π΅Π±-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° Python./ Π”ΠΆ. Π€ΠΎΡ€ΡΡŒΠ΅, П. БиссСкс, Π£. Π§Π°Π½, — БПб.: Π‘ΠΈΠΌΠ²ΠΎΠ»-Плюс, 2010. — 456 с.

3 Π›ΡƒΡ‚Ρ† М. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Python, Ρ‚ΠΎΠΌ ?-? ?, 4-Π΅ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅/ М. Π›ΡƒΡ‚Ρ† — БПб.: Π‘ΠΈΠΌΠ²ΠΎΠ»-Плюс, 2011. — 922 с.

4 Π‘ΠΈΠ·Π»ΠΈ, Π”. Python. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹ΠΉ справочник, 4-Π΅ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅/ Π”. Π‘ΠΈΠ·Π»ΠΈ — М.: Π‘ΠΈΠΌΠ²ΠΎΠ»-Плюс, 2010. — 326 с.

5 Object-Relational Mapping! [Π­Π»Π΅ΠΊΡ‚Ρ€ΠΎΠ½Π½Ρ‹ΠΉ рСсурс] // ORM. URL: http://ru.wikipedia.org/wiki/ORM. (Π”Π°Ρ‚Π° обращСния: 12.03.2012).

6 Django [Π­Π»Π΅ΠΊΡ‚Ρ€ΠΎΠ½Π½Ρ‹ΠΉ рСсурс] // Django. URL: http://ru.wikipedia.org/wiki/Django. (Π”Π°Ρ‚Π° обращСния: 2.09.2013)

7 Buter-Brod [Π­Π»Π΅ΠΊΡ‚Ρ€ΠΎΠ½Π½Ρ‹ΠΉ рСсурс] // ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΠ΅ΠΌ ΠΊΠΎΡ€ΠΏΠΎΡ€Π°Ρ‚ΠΈΠ²Π½ΡƒΡŽ ΡΠ΅Ρ‚ΡŒ asmallworld.net для Π±ΠΎΠ³Π°Ρ‚Ρ‹Ρ… ΠΈ Π·Π½Π°ΠΌΠ΅Π½ΠΈΡ‚Ρ‹Ρ…. URL: http://buter-brot.ru/Moda/prdedstavlyaem-soczialnuyu-set-asmallworldnet-dlya-bogatyx-i-znamenityx.html/. (Π”Π°Ρ‚Π° обращСния: 4.04.2014).

8 ASmallWorld. ΠšΠΎΡ€ΠΏΠΎΡ€Π°Ρ‚ΠΈΠ²Π½Π°Ρ ΡΠ΅Ρ‚ΡŒ [Π­Π»Π΅ΠΊΡ‚Ρ€ΠΎΠ½Π½Ρ‹ΠΉ рСсурс] // URL: https://www.asmallworld.com/. (Π”Π°Ρ‚Π° обращСния: 4.30.2014).

9 Adamant [Π­Π»Π΅ΠΊΡ‚Ρ€ΠΎΠ½Π½Ρ‹ΠΉ рСсурс] // ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ систСмных Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ. URL: http://www.adamant.ua/projects/corporate-network/. (Π”Π°Ρ‚Π° обращСния: 4.04.2014).

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ A

Π€Π°ΠΉΠ» manage. py

#!/usr/bin/env python

from django.core.management import execute_manager

import imp

try:

imp.find_module ('settings') # Assumed to be in the same directory.

except ImportError:

import sys

sys.stderr.write («Error: Can’t find the file 'settings.py' in the directory containing % r. It appears you’ve customized things. nYou'll have to run django-admin.py, passing it your settings module. n"% __file__)

sys.exit (1)

import settings

if __name__ == «__main__»:

execute_manager (settings)

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π‘

Папка settings:

Π€Π°ΠΉΠ» __init.py__ (содСрТит всС настройки Django):

# -* — encoding: utf-8 -*-

import os, sys

from django. contrib import messages

from django.utils.translation import ugettext_lazy as _

import os. path

DEBUG = True

PROJECT_ROOT = os.path.realpath (os.path.join (os.path.dirname (__file__),". ./."))

rel = lambda p: os.path.join (PROJECT_ROOT, p)

TEMPLATE_DEBUG = DEBUG

MANAGERS = ADMINS

EMAIL_BACKEND = 'django.core.mail.backends.filebased. EmailBackend'

EMAIL_FILE_PATH = os.path.join (PROJECT_ROOT, '_emails')

EMAIL_HOST = 'localhost'

EMAIL_PORT = '8000'

EMAIL_HOST_USER = ''

EMAIL_HOST_PASSWORD = ''

EMAIL_USE_TLS = True

DATABASES = {

'default': {

'ENGINE': 'django.db.backends.postgresql_psycopg2',#mysql',

'NAME': 'diplom',

'USER': 'postgres',

'PASSWORD': 'postgres',

'HOST': '127.0.0.1',

'PORT': '5432',

}

}

ALLOWED_HOSTS = []

TIME_ZONE = 'Europe/Moscow'

LANGUAGE_CODE = 'ru-ru'

SITE_ID = 1

USE_I18N = True

USE_L10N = True

USE_TZ = True

LOCALE_PATHS = (os.path.join (PROJECT_ROOT, 'locale'),)

MEDIA_ROOT = os.path.join (PROJECT_ROOT, 'private/media/')

MEDIA_URL = '/media/'

STATIC_ROOT = os.path.join (PROJECT_ROOT, 'public/static/')

STATIC_URL = '/static/'

ADMIN_MEDIA_PREFIX = '/static/admin/'

STATICFILES_DIRS = (

os.path.join (PROJECT_ROOT, 'diplom/static/'),

)

DEFAULT_HOST = 'www.example.com'

STATICFILES_FINDERS = (

'django.contrib.staticfiles.finders. FileSystemFinder',

'django.contrib.staticfiles.finders. AppDirectoriesFinder',

)

SECRET_KEY = '_z (8gb-k+c^y5^1r3b02^km64ve0) bja % soa3@a23d5@*geodf'

TEMPLATE_DEBUG = DEBUG

TEMPLATE_CONTEXT_PROCESSORS = (

'django.core.context_processors.request',

'django.contrib.auth.context_processors.auth',

'django.core.context_processors.debug',

'django.core.context_processors.i18n',

'django.core.context_processors.media',

'django.core.context_processors.static',

'django.core.context_processors.tz',

'django.contrib.messages.context_processors.messages',

)

TEMPLATE_LOADERS = (

'django.template.loaders.filesystem. Loader',

'django.template.loaders.app_directories. Loader',

'django.template.loaders.eggs. Loader',

)

TEMPLATE_DIRS = (

os.path.join (PROJECT_ROOT, 'templates/'),

)

«» «Middleware related settings.»" «

MIDDLEWARE_CLASSES = (

'django.middleware.common. CommonMiddleware',

'django.contrib.sessions.middleware. SessionMiddleware',

'django.middleware.locale. LocaleMiddleware',

'django.middleware.csrf. CsrfViewMiddleware',

'django.contrib.auth.middleware. AuthenticationMiddleware',

'django.contrib.messages.middleware. MessageMiddleware',

'django.middleware.clickjacking.XFrameOptionsMiddleware',

)

AUTHENTICATION_BACKENDS = (

'django.contrib.auth.backends. ModelBa

EMAIL_HOST = 'localhost'

EMAIL_PORT = 1025

EMAIL_HOST_USER = ''

EMAIL_HOST_PASSWORD = ''

EMAIL_USE_TLS = False

DEFAULT_FROM_EMAIL = 'info@google.ru'

LOGGING = {

'version': 1,

'disable_existing_loggers': False,

'filters': {

'require_debug_false': {

'()': 'django.utils.log. RequireDebugFalse'

}

},

'handlers': {

'mail_admins': {

'level': 'ERROR',

'filters': ['require_debug_false'],

'class': 'django.utils.log. AdminEmailHandler'

}

},

'loggers': {

'django.request': {

'handlers': ['mail_admins'],

'level': 'ERROR',

'propagate': True,

},

}

}

AUTH_PROFILE_MODULE = 'profile. Profile’ckend', # this is default

'guardian.backends. ObjectPermissionBackend',

)

ANONYMOUS_USER_ID = -1

ROOT_URLCONF = 'diplom.urls'

MESSAGE_TAGS = {

messages.DEBUG: 'debug',

messages.INFO: 'alert-info',

messages.SUCCESS: 'alert-success',

messages.WARNING: 'alert-warning',

messages.ERROR: 'alert-error',

}

FIXTURE_DIRS = (

os.path.join (PROJECT_ROOT, 'diplom/fixtures'),

)

WSGI_APPLICATION = 'diplom.wsgi.application'

INSTALLED_APPS = (

'django.contrib.auth',

'django.contrib.contenttypes',

'django.contrib.sessions',

'django.contrib.sites',

'django.contrib.messages',

'django.contrib.staticfiles',

'django.contrib.flatpages',

'django.contrib.redirects',

'filebrowser',

'grappelli.dashboard',

'grappelli',

'guardian',

'django.contrib.admin',

'django.contrib.admindocs',

'south',

'registration',

'diplom',

'profile',

'blog',

'messages',

)

from installed_apps.grappelli import *

from installed_apps.logs import *

from installed_apps.filebrowser import *

SESSION_SERIALIZER = 'django.contrib.sessions.serializers.JSONSerializer'

DEFAULT_FROM_EMAIL = 'info@google.ru'

LOGGING = {

'version': 1,

'disable_existing_loggers': False,

'filters': {

'require_debug_false': {

'()': 'django.utils.log. RequireDebugFalse'

}

},

'handlers': {

'mail_admins': {

'level': 'ERROR',

'filters': ['require_debug_false'],

'class': 'django.utils.log. AdminEmailHandler'

}

},

'loggers': {

'django.request': {

'handlers': ['mail_admins'],

'level': 'ERROR',

'propagate': True,

},

}

}

AUTH_PROFILE_MODULE = 'profile. Profile'

Π€Π°ΠΉΠ» installed_apps/filebrowser.py (содСрТит всС настройки для Filebrowser):

# -* — encoding: utf-8 -*-

from django.utils.translation import ugettext_lazy as _

FILEBROWSER_DIRECTORY = 'uploads/'

FILEBROWSER_CONVERT_FILENAME = True

FILEBROWSER_NORMALIZE_FILENAME = True

FILEBROWSER_VERSIONS = {

'admin_thumbnail': {'verbose_name': _('Admin Thumbnail'), 'width': 60, 'height': 60, 'opts': 'crop'},

'thumbnail': {'verbose_name': _('Thumbnail (1 col)'), 'width': 60, 'height': 60, 'opts': 'crop'},

'news_logo': {'verbose_name': (u'Π›ΠΎΠ³ΠΎΡ‚ΠΈΠΏ новости'), 'width': 100, 'height': 75, 'opts': 'crop'},

'services_thumbnail': {'verbose_name': (u'ΠœΠΈΠ½ΠΈΠ°Ρ‚ΡŽΡ€Ρ‹ для услуг'), 'width': 120, 'height': 90, 'opts': 'crop'},

'our_face': {'verbose_name': (u'Π€ΠΎΡ‚ΠΎΠ³Ρ€Π°Ρ„ΠΈΠΈ Π½Π°ΡˆΠΈΡ… сотрудников'), 'width': 216, 'height': 278, 'opts': 'crop'},

'profile_photo': {'verbose_name': (u'Ѐотография ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ'), 'width': 205, 'height': 250, 'opts': 'crop'},

'admin_list_blog': {'verbose_name':u'Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ для списока Π±Π»ΠΎΠ³ΠΎΠ² (655*215)', 'width': 655, 'height': 215, 'opts': 'crop'},

}

FILEBROWSER_ADMIN_VERSIONS = ['thumbnail', 'news_logo', 'services_thumbnail', 'our_face', 'profile_photo',

'admin_list_blog'] #'small', 'medium', 'big', 'large',

FILEBROWSER_ADMIN_THUMBNAIL = 'admin_thumbnail'

FILEBROWSER_MAX_UPLOAD_SIZE = 60 485 760

FILEBROWSER_IMAGE_MAXBLOCK = 1024*1024

FILEBROWSER_EXTENSIONS = {

'Folder': [''],

'Image': ['.jpg', '.jpeg', '.gif', '.png', '.tif', '.tiff'],

'Document': ['.pdf', '.doc', '.rtf', '.txt', '.xls', '.csv'],

'video': ['.mov', '.wmv', '.mpeg', '.mpg', '.avi', '.rm'],

'audio': ['.mp3', '.mp4', '.wav', '.aiff', '.midi', '.m4p']

}

FILEBROWSER_SELECT_FORMATS = {

'file': ['Folder', 'Image', 'Document', 'video', 'audio'],

'image': ['Image'],

'document': ['Document'],

'media': ['video', 'audio'],

}

Π€Π°ΠΉΠ» diplom/urls.py (содСрТит всС url настроСк ΠΈ ΡΡΠ»Ρ‹ΠΊΠΈ Π½Π° urls. py Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ):

from django.conf.urls import patterns, include, url

from django. conf import settings

from django. contrib import admin

from filebrowser. sites import site

from.forms import RegistrationFormProfile

from profile. views import ProfileSettingView, UploadView

import registration

import os

admin.autodiscover ()

urlpatterns = patterns ('',

(r'^accounts/', include ('registration.urls')),

url (r'^grappelli/', include ('grappelli.urls')),

(r'^accounts/', include ('registration.urls')),

(r'^accounts/profile/$', 'profile.views.profile_return'),

(r'^accounts/edit/profile/$', ProfileSettingView. as_view ()),

url (r'^admin/filebrowser/', include (site.urls)),

url (r'^admin/', include (admin.site.urls)),

url (r'^media/(? P.*)$', 'django.views.static.serve', {'document_root': settings. MEDIA_ROOT}),

url (r'^admin/doc/', include ('django.contrib.admindocs.urls')),

(r'^upload_file/$', UploadView. as_view ()),

url (r'^profile/', include ('profile.urls')),

url (r'^message/', include ('messages.urls')),

url (r'^blog/', include ('blog.urls')),

)

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ PROFILE:

Π€Π°ΠΉΠ» profile/urls.py (содСрТит всС url-Ρ‹ прилоТСния profile):

from django.conf.urls import patterns, include, url

from views import ProfileView

urlpatterns = patterns ('',

url (r'^$', ProfileView. as_view (), name= «profile»),

url (r'^friend/(? Pd+)/$', ProfileView. as_view (), name= «profile_friend»),

url (r'^friends/all/$', 'profile.views.search_person'),

url (r'^friends/add/(? P[^/]+)/$', 'profile.views.add_person'),

url (r'^friends/del/(? P[^/]+)/$', 'profile.views.del_person'),

url (r'^friends/accept/(? P[^/]+)/$', 'profile.views.accept_friend'),

url (r'^friends/reject/(? P[^/]+)/$', 'profile.views.reject_friend'),

)

Π€Π°ΠΉΠ» profile/models.py (содСрТит ΠΌΠΎΠ΄Π΅Π»ΠΈ Profile ΠΈ FileProfile прилоТСния profile):

# -* — coding: utf-8 -*-

from django. db import models

from django.contrib.auth.models import User

from diplom. settings import *

from filebrowser. fields import FileBrowseField

from django.core.urlresolvers import reverse

import datetime

class Profile (models. Model):

user = models. ForeignKey (User, related_name='profile', verbose_name=('User'), blank=True, null=True)

thumbnail = FileBrowseField (u «Π˜ΠΊΠΎΠ½ΠΊΠ°», max_length=200, directory='uploads/', format='image', null=True, blank=True)

requisites = models. TextField (u'Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ свСдСния', blank=True)

login = models. CharField (u'Π›ΠΎΠ³ΠΈΠ½', max_length=150, blank=True, null=True)

last_name = models. CharField (u'Ѐамилия', max_length=150, blank=True)

first_name = models. CharField (u'Имя', max_length=150, blank=True)

midlle_name = models. CharField (u'ΠžΡ‚Ρ‡Π΅ΡΡ‚Π²ΠΎ', max_length=150, blank=True)

friends = models. ManyToManyField («self», blank=True, null=True, symmetrical = False, related_name='friends_targets')

friend_requests = models. ManyToManyField («self», blank=True, null=True, symmetrical = False, related_name='friend_requests_targets')

icq = models. CharField (u'ICQ', max_length=150, blank=True)

skype = models. CharField (u'Skype', max_length=150, blank = True)

telephone = models. CharField (u'Π’Π΅Π»Π΅Ρ„ΠΎΠ½', max_length=150, blank = True)

party = models. BooleanField (u'ЯвляСтся участником сообщСства', blank=True, default=False)

def __unicode__(self):

return u' % s'% (self.user)

def get_absolute_url (self):

return reverse («profile», kwargs={})

def get_files (self):

return FileProfile.objects.filter (user = self)

class Meta:

verbose_name = u «ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ»

verbose_name_plural = u «ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ»

class FileProfile (models. Model):

user = models. ForeignKey (Profile, related_name='profile', verbose_name=('User'), blank=True, null=True)

title = models. CharField (u «Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ», max_length=64, blank=True, null=True)

date = models. DateTimeField (verbose_name=u'Π”Π°Ρ‚Π° Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Ρ„Π°ΠΉΠ»Π°', blank=True, null=True, default = datetime.datetime.now)

file = FileBrowseField (u «Π€Π°ΠΉΠ»», directory='uploads/files/', max_length=100, format = 'document', null=True, blank=True)

def __unicode__(self):

return u' % s'% (self.user)

class Meta:

verbose_name = u «Π€Π°ΠΉΠ» ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ«

verbose_name_plural = u «Π€Π°ΠΉΠ»Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ«

Π€Π°ΠΉΠ» profile/admins.py (содСрТит ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΈ Π½Π°ΡΡ‚Ρ€ΠΎΠΉΠΊΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ Profile, FileProfile для административной части):

from django. contrib import admin

from models import Profile, FileProfile

class ProfileContentAdmin (admin. TabularInline):

model = FileProfile

fields = ('title', 'file',)

extra = 1

class FileProfileAdmin (admin. ModelAdmin):

list_display = ('user', 'title', 'file', 'date')

ordering = ('user', 'date')

list_filter = ('user', 'date')

class ProfileAdmin (admin. ModelAdmin):

list_display = ('user', 'last_name', 'first_name', 'midlle_name', 'party')

ordering = ('user',)

list_filter = ('user',)

inlines = [ProfileContentAdmin]

admin.site.register (Profile, ProfileAdmin)

admin.site.register (FileProfile, FileProfileAdmin)

Π€Π°ΠΉΠ» profile/forms.py (содСрТит ΠΌΠΎΠ΄Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΠΎΡ€ΠΌΡ‹ ProfileForm, BlogForm, FileForm прилоТСния profile):

# -* — encoding: utf-8 -*-

from django import forms

from models import Profile, FileProfile

from blog. models import Blog

class ProfileForm (forms. ModelForm):

class Meta:

model = Profile

exclude = ('user', 'thumbnail', 'login', 'friends', 'friend_requests', 'party')

image = forms. FileField (max_length=200, label= «Π˜ΠΊΠΎΠ½ΠΊΠ°», required=False)

new_password = forms. CharField (max_length=150, required=False, label='Новый ΠΏΠ°Ρ€ΠΎΠ»ΡŒ')

confirm_password = forms. CharField (max_length=150, required=False, label='ΠŸΠΎΠ΄Ρ‚Π²Π΅Ρ€Π΄ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ')

class BlogForm (forms. ModelForm):

class Meta:

model = Blog

exclude = ('number', 'author', 'date_of_publication', 'image', 'tags')

thumbnail = forms. FileField (max_length=200, label= «ΠžΠ±Π»ΠΎΠΆΠΊΠ° новости», required=False)

class FileForm (forms. ModelForm):

class Meta:

model = FileProfile

exclude = ('user', 'date', 'file')

doc = forms. FileField (max_length=200, label= «Π€Π°ΠΉΠ»», required=False)

Π€Π°ΠΉΠ» profile/views.py (содСрТит View ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» Π³Π»Π°Π²Π½ΠΎΠΉ страницы ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈ ΡΡ‚Ρ€Π°Π½ΠΈΡ†Ρ‹ поиска Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ):

# -* — coding: utf-8 -*-

from django.views.generic import ListView, DetailView, TemplateView, View

from models import Profile

from messages. models import Chat, Message

from django.views.decorators.csrf import csrf_exempt

from django. shortcuts import render_to_response

from django.contrib.auth.models import User

from forms import ProfileForm, BlogForm, FileForm

from django.views.generic.edit import FormView, CreateView, UpdateView

from django. template import RequestContext

from django import forms

from django.db.models import Q

from django. http import HttpResponse, HttpResponseRedirect

import datetime

from django. shortcuts import render_to_response, redirect

from blog. models import Blog, Tags

from django.core.urlresolvers import reverse

from django.core.files.storage import default_storage

from django.core.files.base import ContentFile

from filebrowser. base import FileObject

def profile_return (request):

return render_to_response ('profile/return.html', {}, context_instance=RequestContext (request))

class UploadView (View):

def post (self, request, *args, **kwargs):

form = FileForm (request.POST, request. FILES)

if form. is_valid:

instance = form. save (commit=False)

path = default_storage.save ('uploads/files/file.pdf', ContentFile (self.request.FILES['doc']. read ()))

instance.file = FileObject (path)

instance.user = Profile.objects.get (user = request. user)

instance.save ()

return redirect (self.get_absolute_url ())

def get_absolute_url (self):

return reverse («profile», kwargs={})

class ProfileView (CreateView):

template_name = «profile/profile.html»

form_class = BlogForm

def create_object_profile (self, pk):

vector = User.objects.get (pk = pk)

object = Profile ()

object.user_id = vector. id

object.first_name = vector. first_name

object.last_name = vector. last_name

object.save ()

return object

def get_context_data (self, **kwargs):

context = super (ProfileView, self).get_context_data (**kwargs)

if (self.request.user.is_authenticated ()) and (Profile.objects.get (pk=self.request.user.id).party==True) and (not 'pk' in self. kwargs):

person_obj = self.request.user

if Profile.objects.filter (pk=person_obj.id).count ()==0:

self.create_object_profile (person_obj.id)

person_pk = person_obj.id

elif self.request.user.is_authenticated () and 'pk' in self. kwargs and self. kwargs['pk']:

person_pk = self. kwargs['pk']

if Profile.objects.filter (pk=person_pk).count ()==0:

self.create_object_profile (person_pk)

person_obj = User.objects.get (pk = person_pk)

else:

self.template_name = «profile/error.html»

context['ErrorText'] = u «Π’Ρ‹ Π½Π΅ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹«

context['blog'] = Blog.objects.filter (author=person_obj.username).order_by ('-number',)

context['person'] = Profile.objects.get (pk = person_pk)

context ['form_file'] = FileForm

return context

def form_valid (self, form):

arr_obj_tags=[]

all_tags = self.request.POST['tag']. split (', ' or ', ')

for elem in all_tags:

max_num_tags = Tags.objects.all ().order_by ('-number') [0]

obj_tag = Tags (number = max_num_tags.number+1, name = elem)

obj_tag.save ()

arr_obj_tags.append (obj_tag)

instance = form. save (commit=False)

blogs = Blog.objects.filter (author=self.request.user.username).order_by ('-number')

if blogs. count () > 0:

instance.number = blogs[0]. number+1

else:

instance.number = 1

instance.author = self.request.user.username

instance.date_of_publication = datetime.datetime.now ()

path = default_storage.save ('uploads/mar.jpg', ContentFile (self.request.FILES['thumbnail']. read ()))

obj_image = FileObject (path).version_generate ('admin_list_blog')

instance.image = obj_image

instance.save ()

for elem in arr_obj_tags:

instance.tags.add (elem)

return redirect (self.get_absolute_url ())

def get_absolute_url (self):

return reverse («profile», kwargs={})

class ProfileSettingView (TemplateView, View):

template_name = «user_profile/user_settings.html»

http_method_names = ['get', 'post']

def post (self, request, *args, **kwargs):

object = Profile.objects.get (user = request. user)

form = ProfileForm (request.POST, request. FILES, instance = object) # A form bound to the POST data

if form. is_valid ():

form.save (commit = False)

path = default_storage.save ('uploads/mar.jpg', ContentFile (request.FILES['image']. read ()))

obj_image = FileObject (path).version_generate ('profile_photo')

object.thumbnail = obj_image

object.save ()

# Новый ΠΏΠ°Ρ€ΠΎΠ»ΡŒ ΠΈ ΠŸΠΎΠ΄Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅ пароля

new_password = request. POST ['new_password']

confirm_password = request. POST ['confirm_password']

# Π’Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ ΠΎΠ±ΡŒΠ΅ΠΊΡ‚ User для измСнСия пароля

index = User.objects.get (pk = request.user.id)

index.set_password (new_password)

if new_password == «:

mes = 'ПолС (Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ) пусто:'

else:

if confirm_password == new_password:

mes = 'ΠŸΠ°Ρ€ΠΎΠ»ΠΈ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚!'

index.save ()

else:

mes = 'ΠŸΠ°Ρ€ΠΎΠ»ΠΈ Π½Π΅ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚!'

form.save ()

return redirect (reverse («profile», kwargs={}))

def get_context_data (self, **kwargs):

context = super (ProfileSettingView, self).get_context_data (**kwargs)

if self.request.user.is_authenticated () and Profile.objects.get (pk=self.request.user.id).party==True:

object = Profile.objects.get (user = self.request.user)

context['object'] = object

user_id = self.request.user

context['form'] = ProfileForm (instance = object)

if not Profile.objects.filter (pk = user_id.id):

person = Profile ()

person.pk = user_id.id

person.user = user_id

person.save ()

return context

else:

template_name = «profile/error.html»

context['ErrorText'] = u «Π’Ρ‹ Π½Π΅ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹«

return context

@csrf_exempt

def search_person (request):

ERROR = None

if request.user.is_authenticated () and Profile.objects.get (pk=request.user.id).party==True:

class ContactForm (forms. Form):

last_name = forms. CharField (max_length=150, required=False)

first_name = forms. CharField (max_length=150, required=False)

user = forms. CharField (max_length=150, required=False)

midlle_name = forms. CharField (max_length=150, required=False)

current_user = request.user.get_profile

if request. method == 'POST':

form = ContactForm (request.POST)

params = []

if form. is_valid ():

last_name = form. cleaned_data ['last_name']

first_name = form. cleaned_data ['first_name']

midlle_name = form. cleaned_data ['midlle_name']

user = form. cleaned_data['user']

kargs = {'last_name__icontains':last_name}

params.append (apply (Q, (), kargs))

params.append (Q (first_name__icontains = first_name))

params.append (Q (midlle_name__icontains = midlle_name))

params.append (Q (user__username__icontains = user))

search_result = Profile.objects.filter (*params)

context = {'form': form, 'search_result': search_result, 'User':current_user}

else:

form = ContactForm ()

context = {'form':form, 'User':current_user}

return render_to_response ('friends/search_person.html', context, context_instance=RequestContext (request))

else:

return render_to_response («friends/error.html», {'ErrorText': u" Π’Ρ‹ Π½Π΅ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹«})

def add_person (request, id):

obj = Profile.objects.get (user = id)

user = Profile.objects.get (user = request.user.get_profile)

user.friends.add (obj)

obj.friend_requests.add (user)

return HttpResponseRedirect ('/profile/friends/all/')

def del_person (request, id):

obj = Profile.objects.get (user = id)

user = Profile.objects.get (user = request.user.get_profile)

user.friends.remove (obj)

return HttpResponseRedirect ('/profile/friends/all/')

def accept_friend (request, objid):

obj = Profile.objects.get (user= request.user.get_profile)

obj_friend = Profile.objects.get (user = objid)

obj.friends.add (obj_friend)

obj.friend_requests.remove (obj_friend)

return HttpResponseRedirect ('/profile/friends/all/')

def reject_friend (request, objid):

obj = Profile.objects.get (user = request.user.get_profile)

obj_friend = Profile.objects.get (user = objid)

obj.friend_requests.remove (obj_friend)

return HttpResponseRedirect ('/profile/friends/all/')

@csrf_exempt

def my_friends (request):

ERROR = None

if request.user.is_authenticated () and Profile.objects.get (pk=request.user.id).party==True:

friends = User.objects.all ()

if request. method == 'POST':

pass

context = {'friends': friends}

return render_to_response ('friends/choice_friend.html', context, context_instance=RequestContext (request))

else:

# Ссли нС залогинСн

# Ρ…ΠΎΡ€ΠΎΡˆΠΎ Π±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΈΠ· этой ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€, Ρ‡Ρ‚ΠΎΠ± Π²ΡΡŽΠ΄Ρƒ Π΅Ρ‘ Π½Π΅ Ρ‚ΠΎΡΠΊΠ°Ρ‚ΡŒ Π·Π° собой

return render_to_response («friends/error.html», {'ErrorText': u" Π’Ρ‹ Π½Π΅ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹«})

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ BLOG:

Π€Π°ΠΉΠ» urls. py Π΄Π»Ρ прилоТСния blog:

from django.conf.urls import patterns, include, url

from.views import BlogList, ArticleMonthArchiveView, BlogDetail, FilterTagsView, BlogSearchView

urlpatterns = patterns ('',

url (r'^list/$', BlogList. as_view (), name='blog_list'),

url (r'^(? Pd{4})/(? Pd+)/$',

ArticleMonthArchiveView.as_view (month_format=' % m'),

name= «archive_month_numeric»),

url (r'^detail/(? Pd+)/$', BlogDetail. as_view (), name='blog_detail'),

url (r'^filter/tag/(? Pd+)/', FilterTagsView. as_view (), name='filter_tags'),

url (r'^search/$', BlogSearchView. as_view (), name='blog_search'),

)

Π€Π°ΠΉΠ» models. py Π΄Π»Ρ прилоТСния blog:

# -* — coding: utf-8 -*-

from django. db import models

from django.contrib.auth.models import User

from filebrowser. fields import FileBrowseField

from model_utils.fields import SplitField

from model_utils.models import TimeStampedModel

import datetime

from django.db.models import permalink

from django.core.urlresolvers import reverse

class Tags (models. Model):

number = models. IntegerField (u'ΠŸΠΎΡ€ΡΠ΄ΠΊΠΎΠ²Ρ‹ΠΉ Π½ΠΎΠΌΠ΅Ρ€', blank=True, null=True)

name = models. CharField (u'НазваниС Ρ‚Π΅Π³Π°', max_length=500)

def __unicode__(self):

return u' % s'% (self.name)

class Meta:

verbose_name = u «Π’Π΅Π³»

verbose_name_plural = u «Π’Π΅Π³ΠΈ»

class Blog (models. Model):

number = models. IntegerField (u «ΠŸΠΎΡ€ΡΠ΄ΠΊΠΎΡ‹ΠΉ Π½ΠΎΠΌΠ΅Ρ€», blank=True, null=True)

zagol = models. CharField (u «Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ», max_length=64, blank=True, null=True)

author = models. CharField (u «ΠΠ²Ρ‚ΠΎΡ€», max_length=200, blank=True)

image = FileBrowseField (u «Π€ΠΎΡ‚ΠΎ», max_length=200, directory='images/blog/', format='image', null=True, blank=True)

ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ вСсь тСкст
Π—Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ„ΠΎΡ€ΠΌΡƒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ€Π°Π±ΠΎΡ‚ΠΎΠΉ