Π Π°Π·ΡΠ°Π±ΠΎΡΠΊΠ° Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΡ Π·Π°ΠΊΡΡΡΠΎΠΉ ΠΊΠΎΡΠΏΠΎΡΠ°ΡΠΈΠ²Π½ΠΎΠΉ ΡΠ΅ΡΠΈ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ° 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)