Django рдпреБрдХреНрддрд┐рдпрд╛рдБ рдФрд░ рдЪрд╛рд▓реЗрдВ

рдирдорд╕реНрддреЗ!



рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ - Django рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдХреБрдЫ рдЫреЛрдЯреЗ рд╕реБрдЭрд╛рд╡ рдЬреЛ рдиреМрд╕рд┐рдЦрд┐рдпрд╛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреА рдЕрдкрдиреА рдпрд╛рддреНрд░рд╛ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ Django рдХреЗ рд╕реНрд╡рд╛рдореА рдХреА рддрд░рд╣ рд╣реЛрдЧрд╛!

рдЧреМрд░ рдХреАрдЬрд┐рдП рдХрд┐ рдЗрди рд╕реБрдЭрд╛рд╡реЛрдВ рдХреЛ рдЖрд▓реЛрдЪрдирд╛ рдХреА рдбрд┐рдЧреНрд░реА рдХреЗ рд╕рд╛рде рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдореБрдЭреЗ рдЦреБрд╢реА рд╣реЛрдЧреА рдЕрдЧрд░ рдЖрдкрдХреЛ рдЧрд▓рддрд┐рдпрд╛рдБ / рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓ рдЬрд╛рдП, рдпрд╛ django рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ "рдЪрд┐рдкреНрд╕" рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрдВ, рдЬреЛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рдирд╣реАрдВ рд╣реИрдВред



рддреЛ, рдЪрд▓реЛ рджреВрд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рд╡рд┐рд╡рд░рдг рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВред







venv

рдЖрднрд╛рд╕реА рд╡рд╛рддрд╛рд╡рд░рдг



рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ django рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП virtualenv рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЗрд╕реЗ рдЖрдЬрд╝рдорд╛рдПрдВред



рдпрджрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА virtualenv рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЬрд╡рд╛рдм рджреЗрдВ рдХрд┐ рдЖрдкрдХреЛ рдЬрд░реВрд░рдд рд╣реИ - рдХреЛрдИ рднреА рд╕рд╛рдЗрдЯ-рдкреИрдХреЗрдЬ рдирд╣реАрдВред рдпрд╣ рдзреНрд╡рдЬ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕рдХреНрд╖рдо рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд░реНрдЪреБрдЕрд▓ рд╡рд╛рддрд╛рд╡рд░рдг рдмрдирд╛рддреЗ рд╕рдордп рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬрдм рдХрд╛рд░реНрдпрдХреНрд░рдо "рдЕрдВрджрд░" рдХреЗ рд▓рд┐рдП рдзреНрд╡рдЬ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдкрд░реНрдпрд╛рд╡рд░рдг рдХрд╛рд░реНрдпрдХреНрд░рдо "рдмрд╛рд╣рд░" рдирд╣реАрдВ рджреЗрдЦреЗрдЧрд╛ред рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рдкреИрдХреЗрдЬ рдореИрдиреЗрдЬрд░ рдХреЛ рд╡реИрд╢реНрд╡рд┐рдХ рд░реВрдк рд╕реЗ рдкреИрдХреЗрдЬ рдХрд░рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, python2-django, рддреЛ рдЖрдкрдХреЛ рдЕрднреА рднреА рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЗ рдЕрдВрджрд░ "рд╕реНрдерд╛рдкрд┐рдд" django рдкрд╛рдЗрдк рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдЖрдкрдХреЛ рд╡рд┐рд╢реНрд╡ рд╕реНрддрд░ рдкрд░ рд╕реНрдерд╛рдкрд┐рдд рдкреИрдХреЗрдЬреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реЛ рд╕рдХрддреА рд╣реИ?
рдореИрдВ рдЗрд╕ рдкрд░ рдЖрдпрд╛ рдерд╛ рдЬрдм xapian рдкрд░ рдПрдХ рдЦреЛрдЬ рдЗрдВрдЬрди рдХреА рд╕реНрдерд╛рдкрдирд╛ред рдЬрд╝рд╛рдкрд┐рдпрди рдЬрд╝рд╛рдкрд┐рдпрди-рдХреЛрд░ (рд╕реА ++ рдореЗрдВ рд▓рд┐рдЦрд┐рдд) рдФрд░ рдЬрд╝рд╛рдкрд┐рдпрди-рдмрд╛рдЗрдВрдбрд┐рдВрдЧ (рд╡рд┐рднрд┐рдиреНрди рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдпрдХрд╛рд░реА, рдЕрдЬрдЧрд░ рд╕рд╣рд┐рдд) рдХреА рдЖрдкреВрд░реНрддрд┐ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИ - рдпрджрд┐ рдЗрдВрдЬрди рдмрджрд▓ рдЧрдпрд╛ рд╣реИ, рддреЛ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рдПрдХ рдкреИрдХреЗрдЬ рдореИрдиреЗрдЬрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╡реИрд╢реНрд╡рд┐рдХ рд░реВрдк рд╕реЗ xapian-core рдбрд╛рд▓рдирд╛, рдФрд░ рдкрд╛рдЗрдкрд┐рдВрдЧ рдЗрд╕реЗ рдареАрдХ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡реЗ рдкрд╛рдЗрдк рдореЗрдВ рдирд╣реАрдВ рд╣реИрдВ)ред рдЖрдЙрдЯрдкреБрдЯ 2:

  1. Virtualenv рдХреЗ рдЕрдВрджрд░ рдПрдХ рдХрдЪрд░рд╛ рдмрдирд╛рдПрдБ: ./configure --prefix = / path / to / virtualenv && рдореЗрдХ && рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ
  2. рд╡реИрд╢реНрд╡рд┐рдХ рдкреИрдХреЗрдЬ рдХреЛ рдмрд╛рд╣рд░ рд╕реЗ рджреГрд╢реНрдпрдорд╛рди рдмрдирд╛рдПрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╡рд┐рддрд░рдг рдХреЗ рдкреИрдХреЗрдЬ рдореИрдиреЗрдЬрд░ рдХреЗ рд╕рд╛рде рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ, рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЪреБрдирд╛ рдерд╛


рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЬрдм рдореЙрдбреНрдпреВрд▓ рд╢реБрджреНрдз рдЕрдЬрдЧрд░ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ - рд╡рд░реНрдЪреБрдЕрди рдореЗрдВ рдкрд╛рдЗрдк рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВред рдпрджрд┐ рдХреЛрдИ рдореЙрдбреНрдпреВрд▓, рд╕реА + + рдФрд░ рдЕрдЬрдЧрд░ рдХрд╛ рдорд┐рд╢реНрд░рдг рд╣реИ, рддреЛ рдЬрд╛рджреВ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред



Virtualenv рд╕реЗ рд╡реИрд╢реНрд╡рд┐рдХ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреА рджреГрд╢реНрдпрддрд╛ / рдЕрджреГрд╢реНрдпрддрд╛ рдлрд╝рд╛рдЗрд▓ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ / рдЙрдкрд╕реНрдерд┐рддрд┐ [virtualenv] / lib / python *ред * / No-global-site-package.txt рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред рдЗрддрдирд╛ рд╕рд░рд▓ред



рд╡реИрд╕реЗ, рдореИрдВ рд╕рднреА рдХреЛ virtualenv рдХреЗ "рдЕрд▓рдЧрд╛рд╡" рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд▓реЗрдЦ рд╕реБрдЭрд╛рддрд╛ рд╣реВрдВ : рдореБрдЭреЗ virtualenv рдФрд░ рдкрд╛рдЗрдк рд╕реЗ рдирдлрд░рдд рдХреНрдпреЛрдВ рд╣реИ (рд╕рд╛рдЗрдЯ рдзреАрдорд╛ рд╣реЛ рдЬрд╛рддреА рд╣реИ, рдореИрдВ рдХреЗрд╡рд▓ web.archive.org рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЦреЛрд▓ рд╕рдХрддрд╛ рд╣реВрдВ)ред рдпрд╣ рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд░реНрдЪреБрдЕрдирд╡ рдХреЛ "рдмрд╛рд╣рд░реА" рд╡рд╛рддрд╛рд╡рд░рдг рд╕реЗ рдХреИрд╕реЗ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдпрд╣ рдХреЗрд╡рд▓ рдЖрдВрд╢рд┐рдХ рдЕрд▓рдЧрд╛рд╡ рд╣реИред





IPython



рдкрд┐рдк рд╕реНрдерд╛рдкрд┐рдд ipython рдорд╛рдирдХ рдкрд╛рдпрдерди рд╢реЗрд▓ рдХреЛ рдПрдХ рдЙрдиреНрдирдд рдХреЗ рд╕рд╛рде рд░рдВрдЧ, рдСрдЯреЛ-рдкреВрд░реНрдгрддрд╛, рдЖрддреНрдордирд┐рд░реАрдХреНрд╖рдг, рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдорд▓реНрдЯреА-рд▓рд╛рдЗрди рдЗрдирдкреБрдЯ, рдХреЙрдкреА-рдкреЗрд╕реНрдЯ, рдЖрджрд┐ рдХреЗ рд╕рд╛рде рдмрджрд▓ рджреЗрдЧрд╛ред Django рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ ipython рдХреЛ рдЙрдард╛рддрд╛ рд╣реИ рдпрджрд┐ рдпрд╣ рд╕реНрдерд╛рдкрд┐рдд рд╣реИред

рд╡реИрд╕реЗ, рдЗрди рд╕рднреА рдлрд╛рдпрджреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХреЗрд╡рд▓ ./manage.py рд╢реЗрд▓ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдбрд┐рдмрдЧ рдореЗрдВ рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЖрдпрд╛рдд i pdb рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбреАрдмрдЧрд┐рдВрдЧ рд╣реЛ рд╕рдХрддреА рд╣реИ; i pdb.set_trace ()ред



рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╕рдВрд░рдЪрдирд╛



рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдпрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рддреЗ рд╕рдордп Django рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдмрдирд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдЦреБрдж рд╕реЛрдЪрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред



рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдирд╛рдо рджреЗрддреЗ рд╣реИрдВ, рдЖрдк рдЖрдпрд╛рдд рдХрд░реЗрдВрдЧреЗ


рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдирд╛рдо рджреЗрдВ (django-admin.py startproject рдкреНрд░реЛрдЬреЗрдХреНрдЯ) - рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп, рд▓реЗрдХрд┐рди рд╕рднреА рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рдирд╛рдоред рдореИрдВ рдбреЛрдореЗрди рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХрд╛ рдирд╛рдо рджреЗрддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЬрдм рдЕрдиреНрдп рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рдЖрдпрд╛рдд рдкрде рдХреЛ рдмрджрд▓рдирд╛ рдкрдбрд╝рддрд╛ рдерд╛ - рд╕реБрдкрд░рд╕рд╛рдЗрдЯ рдЖрдпрд╛рдд рдХреЗ рдмрд░реНрддрди рд╕реЗ, рдлрд┐рд░ рд╕рдорд╛рдЪрд╛рд░ рдХреЗ рдЖрдпрд╛рдд рдХреЗ рдмрд░реНрддрди рд╕реЗред рдпрд╣ рднреНрд░рд╛рдордХ рдФрд░ рд╡рд┐рдЪрд▓рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЗрд╕ рд╕рд▓рд╛рд╣ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЕрдкрдиреЗ рд▓рд┐рдП рдЕрдкрдиреА рд╕рднреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдареАрдХ рдХрд░реЗрдВ (рдПрдХрдЬреБрдЯ рдХрд░реЗрдВ) рдФрд░ рдЗрд╕рдХрд╛ рд╕рдЦреНрддреА рд╕реЗ рдкрд╛рд▓рди рдХрд░реЗрдВред



рд▓рд╛рдЗрд╡ рдЙрджрд╛рд╣рд░рдг:

--site.ru |--static |--media |--project (  ) |--manage.py |--project (   ) | |--settings.py | |--urls.py | |-- ... |--app1 |--app2 |--...
      
      







Html рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рдХрд╣рд╛рдБ рд╕реЗрд╡ рдХрд░рдирд╛ рд╣реИ


рдХрднреА рднреА, рдХрднреА рднреА рдЕрдкрдиреЗ рдПрдкреНрд▓реАрдХреЗрд╢рди рдХреЗ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЯреЗрдореНрдкреНрд▓реЗрдЯ (.html) рдХреЛ рди рдбрд╛рд▓реЗрдВред рд╣рдореЗрд╢рд╛ рдПрдХ рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдмрдирд╛рдПрдВ рдЬреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдирд╛рдо рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИред

рдпрд╣ рдмреБрд░рд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЯреЗрдореНрдкрд▓реЗрдЯ рдЯрдХрд░рд╛рд╡ рдкреИрджрд╛ рдХрд░рддрд╛ рд╣реИ, {% рдореЗрдВ 'main.html'%} рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:

 /gallery/templates/main.html /reviews/templates/main.html
      
      





рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реИ, рдЖрдк {% рд╢рд╛рдорд┐рд▓ 'рд╕рдореАрдХреНрд╖рд╛рдПрдВ / main.html'%} рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 /gallery/templates/gallery/main.html /reviews/templates/reviews/main.html
      
      







{% рдореЗрдВ% рд╢рд╛рдорд┐рд▓ рд╣реИрдВ}


рд╡реИрд╕реЗ, рдпрджрд┐ рдЖрдк {% рдореЗрдВ way some_template.html тАЩ%} рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдЧрд▓рдд рд╣реИред рдХреНрдпреЛрдВ?

рдПрдХ рдЙрджрд╛рд╣рд░рдг:

 def view(request): return render( request, 'master.html', {'var': 'Some text'} }
      
      





 <!-- master.html --> Value of variable var: {{ var }}. {% include 'slave.html' %} <!-- slave.html --> Again, value of variable var: {{ var }}.
      
      







1) KISS рд▓рдХрдбрд╝реА рд╕рд╡рд╛рд░ рд╣реИред рдПрдХ рдУрд░, рдкреЗрдЬ рдХреЛрдб рдХреЛ рдХрдИ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - master.html рдФрд░ plugin slave.html, рдФрд░ рдпрд╣ рднрд╛рдЧреЛрдВ рдореЗрдВ рдмрдбрд╝реЗ HTML рдкреГрд╖реНрдареЛрдВ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, var рд╡реИрд░рд┐рдПрдмрд▓ slave.html рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рдЙрддреНрддреАрд░реНрдг рд░реВрдк рд╕реЗ рдирд┐рд╣рд┐рдд рд╣реИ - var рдорд╛рд╕реНтАНрдЯрд░.html рдореЗрдВ рдкрд╛рд╕ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдФрд░ slave.html рд╕рд┐рд░реНрдл рдорд╛рд╕реНтАНрдЯрд░ рд╕рдВрджрд░реНрдн рдХреЛ "рд╣реБрдХ" рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ {% рд╢рд╛рдорд┐рд▓%} рдХреЗ рдЕрдВрджрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореБрдЦреНрдп рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд╕рдВрджрд░реНрдн рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рд╣рдо рдкреЗрд░реЗрдВрдЯ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд╕рдВрджрд░реНрдн рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рд╣реИрдВ, рдЕрдиреНрдпрдерд╛ рдЪрд╛рдЗрд▓реНрдб рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рдХреБрдЫ рдЧрд▓рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

2) рдореЗрд░реА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, {% рд╢рд╛рдорд┐рд▓%} рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдорд╣рдВрдЧрд╛ рд╣реИред рдЗрд╕рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реИред



рдХреНрдпрд╛ рдХрд░реЗрдВ? рдпрджрд┐ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЛ рджреВрд╕рд░реЛрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╕рдорд╛рд╡реЗрд╢ рдЯреИрдЧ (рдиреАрдЪреЗ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝реЗрдВ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рд▓реЗрдХрд┐рди рдпрд╣ рдЖрд╕рд╛рди рд╣реИ - рдмрд╕ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рдм рдХреБрдЫ рд▓рд┐рдЦреЗрдВ:

 <!-- master.html --> Value of variable var: {{ var }}. Again, value of variable var: {{ var }}.
      
      







settings.py


рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд░реАрдХреНрд╖рдг рдФрд░ рд╕рд░реНрд╡рд░ рдХреЛ рдкрд░рд┐рдирд┐рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рдЕрд▓рдЧ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдирд╣реАрдВ рд╣реИрдВ, рд╣реИ рдирд╛?

рдЕрддрд┐рд░рд┐рдХреНрдд local_settings.py рдФрд░ dep рддреИрдирд╛рддреА_settings.py рдмрдирд╛рдПрдБ, рдЬрд╣рд╛рдБ рд╡рд╣ рд╕рдм рдХреБрдЫ рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ рд╕рдВрдмрдВрдзрд┐рдд рд╕рд░реНрд╡рд░ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред

рдпрд╣рд╛рдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, local_settings.py рдореЗрдВ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рддрд╛рд░реНрдХрд┐рдХ рд╣реИ
 DEBUG = True DOMAIN = '127.0.0.1:8000' ALLOWED_HOSTS = ['127.0.0.1', DOMAIN] SERVER_EMAIL = 'mail@test.ru' EMAIL_HOST = 'localhost' EMAIL_PORT = 1025 EMAIL_HOST_USER = '' EMAIL_HOST_PASSWORD = '' EMAIL_USE_TLS = False EMAIL_SUBJECT_PREFIX = '[' + DOMAIN + '] ' DEFAULT_FROM_EMAIL = 'mail@test.ru' DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': 'test', 'USER': 'test', 'PASSWORD': 'test', 'HOST': 'localhost', 'PORT': '', 'ATOMIC_REQUESTS': True, } } CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.dummy.DummyCache', } }
      
      









рд╕реЗрдЯрд┐рдВрдЧ рдореЗрдВ рд╣рдо рд╢реБрд░реБрдЖрдд рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:

 # Load local settings if available try: from local_settings import * except ImportError: from deployment_settings import *
      
      





рддрджрдиреБрд╕рд╛рд░, рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдкрд░ рд╣рдо local_settings.py рдХреЛ рд╣рдЯрд╛рддреЗ рд╣реИрдВред рддрд╛рдХрд┐ рдпрд╣ рд╣рд╕реНрддрдХреНрд╖реЗрдк рди рдХрд░реЗ, рдЗрд╕реЗ .gitignore рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред



рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд░реВрдЯ


рд╕реЗрдЯрд┐рдВрдЧ рдореЗрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд░реВрдЯ рдХреЛ рд╕реЗрдЯ рдХрд░реЗрдВред рдпрд╣ рдмрд╛рдж рдореЗрдВ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рдПрдЧрд╛:

 from os import path BASE = path.dirname(path.dirname(path.dirname(path.abspath(__file__)))) MEDIA_ROOT = BASE + '/media/' STATIC_ROOT = BASE + '/static/'
      
      







рдкреНрд░рд╕рдВрдЧ рдкреНрд░реЛрд╕реЗрд╕рд░ (Reference_processors.py), {% рдореЗрдВ%} рдФрд░ рд╕рдорд╛рд╡реЗрд╢ рдЯреИрдЧ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ



рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рддрднреА рдХрд░реЗрдВ рдЬрдм рдЖрдкрдХреЛ рд╕рд╛рдЗрдЯ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдкреГрд╖реНрда рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЪрд░ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ - рдХреНрдпреЛрдВрдХрд┐ рдХрд┐рд╕реА рднреА рдкреГрд╖реНрда рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рднрд▓реЗ рд╣реА рдЖрдк рдЙрдирдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВред рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдлреЛрди рдирдВрдмрд░ рдХреЛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ - рдпрд╣ рд╕рдВрдЦреНрдпрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рд░ рдкреГрд╖реНрда рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддреА рд╣реИ, рдФрд░ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ред рдПрдХ рдЕрдиреНрдп рдЙрджрд╛рд╣рд░рдг рд╕рд╛рдЗрдЯ рдореЗрдиреВ рд╣реИред рдореИрдВрдиреЗ рд╣реЗрдбрд░ рдФрд░ рд▓рд┐рдВрдХ рдХреЛ рд╕рдВрджрд░реНрдн рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рдХрд┐рдпрд╛ рд╣реИ, рдФрд░ рдЕрдЧрд░ рдореБрдЭреЗ рдореЗрдиреВ рдореЗрдВ рдПрдХ рдирдпрд╛ рдЕрдиреБрднрд╛рдЧ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдореИрдВ рдЗрд╕реЗ рдХреЗрд╡рд▓ рд╕рдВрджрд░реНрдн рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЗрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВ рдФрд░ рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рд╛рдЗрдЯ рдкрд░ рд╣рд░ рдЬрдЧрд╣ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛ред



рдПрдХ рдЧрд▓рддреА рд╣реИ - рд╡рд┐рдЧреЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрдн рдкреНрд░реЛрд╕реЗрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреА рд╕рд╛рдЗрдЯ рдкрд░ рдПрдХ рд╕рдорд╛рдЪрд╛рд░ рд╕реНрддрдВрдн рд╣реИ рдЬреЛ рд╣рдореЗрд╢рд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд рд╣рд░ рдкреЗрдЬ рдкрд░ рдпрд╣ рд╕рдорд╛рдЪрд╛рд░ / рд╕рдВрджрд░реНрдн_рдкреНрд░реЛрд╕реЗрд╕рд░реНрд╕рд╣реЛрдо рдмрдирд╛рдиреЗ рдФрд░ рд╕рдВрджрд░реНрдн рдХреЗ рд╕рд╛рде рд╕рдорд╛рдЪрд╛рд░ рдЪрд░ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ {%} рдореЗрдВ template рд╕рдорд╛рдЪрд╛рд░ / news_widget.html тАЩ%}, рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ {% news_widget%} {{news_widget news%} рд╢рд╛рдорд┐рд▓ рд╣реИрдВ ...



рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдВрджрд░реНрдн рдХреЛ рдХрд╛рдЯ рджреЗрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреМрди рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╣рдореЗрд╢рд╛ рдпрд╣ рдХреЙрд▓рдо рд╣реЛрдЧрд╛ред рдПрдХ рд░рд╛рд╕реНрддрд╛ рд╣реИ - рд╕рдорд╛рд╡реЗрд╢ рдЯреИрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдЖрдк рдмрд╕ {{% news%}} рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдЯреЗрдореНрдкреНрд▓реЗрдЯреЗрдЯреИрдЧ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЦрдмрд░реЛрдВ рдХреЛ рдЦреЛрдЬрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдиреНрдпреВрдЬ рдХреЙрд▓рдо рдбрд╛рд▓рддрд╛ рд╣реИред рдФрд░ рдпрд╣ рддрднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрдм рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕реЗ рдЪрд▓рд╛рддреЗ рд╣реИрдВ - рдЕрд░реНрдерд╛рдд рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ {% рд╕рдорд╛рдЪрд╛рд░%} рд▓рд┐рдЦреЗрдВред





рдмреИрдЯрд░реА



Django-рдбрд┐рдмрдЧ-рдЙрдкрдХрд░рдг рдкрдЯреНрдЯреА-рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕рдордп


рд╣рд░ рдХреЛрдИ рдЙрд╕реЗ рдЬрд╛рдирддрд╛ рд╣реИ рдФрд░ рд╢рд╛рдпрдж рдЙрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди django-debug-toolbar-template-timings - рдПрдХ рдбреАрдмрдЧ рдЯреВрд▓рдмрд╛рд░ рдкреНрд▓рдЧрдЗрди рд╣реИ рдЬреЛ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЗ рд░реЗрдВрдбрд░рд┐рдВрдЧ рд╕рдордп рдХреЛ рдорд╛рдкрддрд╛ рд╣реИред рдФрд░ рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ django рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХрд╛рдлреА "рдорд╣рдВрдЧреЗ" рд╣реИрдВ (рд▓рдВрдмреЗ рд╕рдордп рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕реНрддреБрдд рдХрд░реЗрдВ), рдпрд╣ рдкреНрд▓рдЧрдЗрди рд╡рд╣ рд╣реИ рдЬреЛ рдбреЙрдХреНрдЯрд░ рдиреЗ рд╕рд╛рдЗрдЯ рдХреЛ рдЧрддрд┐ рджреЗрдиреЗ рдХрд╛ рдЖрджреЗрд╢ рджрд┐рдпрд╛ рдерд╛ред



adv_cache_tag


django-adv-cache-tag рдЯреЗрдореНрдкреНрд▓реЗрдЯ - рд╡рд░реНрдЬрдирд┐рдВрдЧ, рдХрдореНрдкреНрд░реЗрд╢рди, рдЖрдВрд╢рд┐рдХ рдХреИрд╢рд┐рдВрдЧ рдореЗрдВ рдмрд╣реБрдд рд▓рдЪреАрд▓реЗ рдХреИрд╢рд┐рдВрдЧ рдирд┐рдпрдВрддреНрд░рдг рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдмрд╕ рджрд░:

 {% load adv_cache %} {% cache 0 object_cache_name object.pk obj.date_last_updated %} <!--   ,     obj.date_last_updated --> {{ obj }} {% nocache %} {{ now }} <!--      --> {% endnocache %} {{ obj.date_last_updated }} {% endcache %}
      
      







Django-рдореЗрд▓-рдЯреЗрдореНрдкреНрд▓реЗрдЯ


рдИрдореЗрд▓ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ django рдХрд╛ рдЕрднрд╛рд╡ рд╣реИред Django-рдореЗрд▓-рдЯреЗрдореНрдкреНрд▓реЗрдЯ



Django-ipware


django-ipware рдЖрдкрдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ ip рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░реЗрдЧрд╛, рдФрд░ рдЗрд╕реЗ рдмреЗрд╣рддрд░ рдмрдирд╛рдПрдЧрд╛ ред

рдХреНрдпрд╛ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЖрдИрдкреА рдХрд╣рд╛рдБ рд╕реЗ рдорд┐рд▓реЗрдЧрд╛?
 'HTTP_X_FORWARDED_FOR', # client, proxy1, proxy2 'HTTP_CLIENT_IP', 'HTTP_X_REAL_IP', 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED', 'HTTP_VIA', 'REMOTE_ADDR',
      
      









рд╕реБрдВрджрд░ рд╕реВрдк


рдЕрдкрдирд╛ html parser рди рд▓рд┐рдЦреЗрдВред рд╕реНрд╡рдпрдВ html рдХреЛ рдкрд╛рд░реНрд╕ рди рдХрд░реЗрдВред рд╕рдм рдХреБрдЫ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реИред



Templatetags рдЬреЛ рдХрд╛рдо рдЖ рд╕рдХрддреЗ рд╣реИрдВ



add_class


рдпрджрд┐ рдЖрдк рдПрдХ рдлреЙрд░реНрдо рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдЯрд╛рдЗрд▓, рдХреНрд▓рд╛рд╕ рдпрд╛ рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рд╕реЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ django рдЖрдкрдХреЛ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рдиреЗ рдФрд░ рд╕рднреА рд╢реИрд▓рд┐рдпреЛрдВ рдХреЛ рд╕реАрдзреЗ рдлреЙрд░реНрдорд╣реЛрдо рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░реЗрдЧрд╛:

 class SomeForm(ModelForm): class Meta: model = SomeModel fields = ('field1', 'field2') widgets = { 'field1': Textarea(attrs={'rows': '2', 'class': 'field1_class'}), }
      
      





рд╣рд░ рдмрд╛рд░ рдЬрдм рдореИрдВ html рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ .html рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рдШрдмрд░рд╛рд╣рдЯ рд╣реЛрддреА рд╣реИред рдпрд╣ рдПрдорд╡реАрдЯреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рдЕрдкрдиреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рд┐рд▓реНрдЯрд░ рдмрдирд╛рдпрд╛:

 {% load add_class %} {{ form.field1|add_class:'field1_class' }}
      
      





рдпрд╣ рдлрд╝рд┐рд▓реНрдЯрд░ рдЯреИрдЧ рдореЗрдВ рдПрдХ рд╡рд░реНрдЧ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдХрд┐рд╕реА рднреА рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред

рдХреЛрдб add_class.py
 from django import template from django.utils.safestring import mark_safe from bs4 import BeautifulSoup register = template.Library() @register.filter def add_class(html, css_class): soup = BeautifulSoup(unicode(html), 'html.parser') for tag in soup.children: if tag.name != 'script': if 'class' in tag: tag['class'].append(css_class) else: tag['class'] = [css_class] return mark_safe(soup.renderContents())
      
      









is_current_page


рдХрднреА-рдХрднреА рдЖрдкрдХреЛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдХреБрдЫ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдпрджрд┐ рдХреЛрдИ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреГрд╖реНрда рдЦреБрд▓рд╛ рд╣реЛред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореЗрдиреВ рдореЗрдВ "рд╕реНрдЯреЛрд░" рдмрдЯрди рдХреЛ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд░реЗрдВ рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдм рд╕реНрдЯреЛрд░ рд╕реЗрдХреНрд╢рди рдореЗрдВ рд╣реИред рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдХрд▓реНрдк рд╕реБрдЭрд╛рддрд╛ рд╣реВрдВ:

 from django import template from django.core.urlresolvers import resolve from project.utils import parse_args register = template.Library() @register.filter def is_current_page(request, param): return resolve(request.path).view_name == param
      
      





рдпрд╣ рдПрдХ рдлрд┐рд▓реНрдЯрд░ рд╣реИ, рдПрдХ рдЯреИрдЧ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рд╕рдорд╛рди рд╣реИ: рдЖрдк {% if%} рдХреЗ рд╕рд╛рде рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмреЗрддрд╣рд╛рд╢рд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╡рд░реНрддрдорд╛рди рдкреГрд╖реНрда рдЙрддреНрдкрд╛рдж рдХрд╛рд░реНрдб рд╣реИ, рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдзрд┐рдХреГрдд рд╣реИ:

 {% if request|is_current_page:'shop/product' and user.is_authenticated %}
      
      





рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ, рдЕрдзрд┐рдХ рд╕рдЯреАрдХ, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ, рдЬреЛ рд╕рдЯреАрдХ рдкреГрд╖реНрда рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реНрдХреЛрдВ (args рдпрд╛ kwargs) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ (рдЕрд░реНрдерд╛рдд, рдХреЗрд╡рд▓ "рдХреБрдЫ рдЙрддреНрдкрд╛рдж рдХрд╛ рдкреГрд╖реНрда" рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди "рдЖрдИрдбреА рдХреЗ рд╕рд╛рде рдЙрддреНрдкрд╛рдж рдкреГрд╖реНрда = 36"):

 {% if request|is_current_page:'shop/product,id=36' %}
      
      





 @register.filter def is_current_page(request, param): params = param.split(',') name = params[0] args, kwargs = parse_args(params[1:]) # Do not mix args and kwargs in reverse() - it is forbidden! if args: return request.path == reverse(name, args=args) elif kwargs: return request.path == reverse(name, kwargs=kwargs) else: return request.path == reverse(name)
      
      









рдЖрджрд░реНрд╢



рд░рд┐рдХреНрдд


рдореЙрдбрд▓ рдЦрд╛рд▓реА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рддрд░рд╣:

 class Phrase(models.Model): pass class PhraseRu(models.Model): phrase = models.ForeignKey(Phrase, verbose_name='', related_name='ru') class PhraseEn(models.Model): phrase = models.ForeignKey(Phrase, verbose_name='', related_name='en')
      
      





рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╡рд╛рдХреНрдпрд╛рдВрд╢ PhraseEn рдФрд░ PhraseRu рдХреЗ рдмреАрдЪ рдХреА рдХрдбрд╝реА рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕рдореЗрдВ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИред рдпрд╣ рддрдм рдЙрдкрдпреЛрдЧреА рд╣реЛрддрд╛ рд╣реИ рдЬрдм рджреЛ рдореЙрдбрд▓ рд╕рдорддреБрд▓реНрдп рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдЙрдиреНрд╣реЗрдВ рдПрдХ рдкреВрд░реЗ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред



рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдмрдВрдз рдорд┐рд╢реНрд░рдг


GenericRelation рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╣рдореЗрд╢рд╛ QuerySet рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рд╣рдо рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдирддреЗ рд╣реЛрдВ рдХрд┐ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╡рд╕реНрддреБ рд╣реИ:

 class Token(models.Model): content_type = models.ForeignKey(ContentType) object_id = models.PositiveIntegerField() content_object = generic.GenericForeignKey() class Registration(models.Model): tokens = generic.GenericRelation(Token)
      
      





рдпрджрд┐ рдЖрдкрдХреЛ рдЯреЛрдХрди рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд╣рдо Registration.tokens.first () рд▓рд┐рдЦрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдЯреЛрдХрди рд╣реИ, рдФрд░ рд╣рдо рдЕрднреА рдкрдВрдЬреАрдХрд░рдг рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЯреЛрдХрди рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдФрд░ рддреБрд░рдВрдд рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред рдпрд╣ рдорд┐рд╢реНрд░рдг рдХреЗ рд╕рд╛рде рд╕рдВрднрд╡ рд╣реИ:

 class Token(models.Model): content_type = models.ForeignKey(ContentType) object_id = models.PositiveIntegerField() content_object = generic.GenericForeignKey() class TokenMixin(object): @property def token(self): content_type = ContentType.objects.get_for_model(self.__class__) try: return Token.objects.get(content_type__pk=content_type.pk, object_id=self.id) except Token.DoesNotExist: return None class Registration(models.Model, TokenMixin): tokens = generic.GenericRelation(Token)
      
      







рдЕрдм рдкрдВрдЬреАрдХрд░рдгред рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ!



get_absolute_url




рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдХрд┐ {% url 'рдХреА рджреБрдХрд╛рди / рдЙрддреНрдкрд╛рдж' id = product.id%} рди рд▓рд┐рдЦреЗрдВред

рдкреНрд░рддреНрдпреЗрдХ рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░, get_absolute_url () рд╡рд┐рдзрд┐ рд╕реЗрдЯ рдХрд░реЗрдВ, рдФрд░ {{object.get_absolute_url}} рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдЙрд╕реА рд╕рдордп, рд▓рд┐рдВрдХ "рд╕рд╛рдЗрдЯ рдкрд░ рджреЗрдЦреЛ" рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдкреИрдирд▓ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред



pre_save


Pre_save рдореЗрдВ, рдЖрдк рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдореЙрдбрд▓ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рдмрд╛рдж рдмрджрд▓реЗрдЧрд╛ рдпрд╛ рдирд╣реАрдВред рдореВрд▓реНрдп - рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдкреБрд░рд╛рдирд╛ рд░рд┐рдХреЙрд░реНрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдЕрдиреБрд░реЛрдзред

 @receiver(pre_save, sender=SomeModel) def process_signal(sender, instance, **kwargs): old_model = get_object_or_None(SomeModel, pk=instance.pk) if not old_model: # Created old_value = None ... else: old_value = old_model.field new_value = instance.field if new_value != old_value: # field changed!
      
      







рдЖрдХрд╛рд░



рдпрд╣ рдкреИрдЯрд░реНрди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣рдм рдкрд░ рдерд╛, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд░рдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИред

 form = SomeForm(request.POST or None) if form.is_valid(): # ... actions ... return HttpResponseRedirect(...) return render( request, {'form': form} )
      
      







рд╡рд╣ рд╕рдм рд╣реИред рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред



рдпреБрдкреАрдбреАред рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣ Habr├й, рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдлреЗрд░реАрд╡рд╛рд▓реЛрдВ рдиреЗ рдЕрдкрдиреА рд░рд╛рдп рд╡реНрдпрдХреНрдд рдХреА рдФрд░ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рдорд╣рд╛рди рд╡рд┐рдЪрд╛рд░реЛрдВ, рдкрд░рд┐рд╡рд░реНрдзрди рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдкреЗрд╢ рдХрд┐рдпрд╛ред рдореИрдВрдиреЗ рдЙрдиреНрд╣реЗрдВ рд▓реЗрдЦ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдореИрдВ рджреГрдврд╝рддрд╛ рд╕реЗ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рд▓реЗрдЦ рдкрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рдкрдврд╝реЗрдВред



All Articles