рд╢реБрдн рджреЛрдкрд╣рд░
рдЕрдХреНрд╕рд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ (рдкреНрд░рд╢рд╛рд╕рдирд┐рдХ) рд╕рд╛рдЗрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рджреЛ рд╕рд╛рдзрд╛рд░рдг рдХрд╛рд░рдгреЛрдВ рд╕реЗ settings.py рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: settings.py рд╕реЗ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рд╕рд░реНрд╡рд░ рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд┐рдП рдмрд┐рдирд╛ рдирд╣реАрдВ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ; рдФрд░ - рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд - рд╡реЗ рдХреЗрд╡рд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рджреНрд╡рд╛рд░рд╛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред
Django-dbsettings рдореЙрдбреНрдпреВрд▓ (рдкреВрд░реНрд╡ рдореЗрдВ django-values) рдХреЛ рдЗрди рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рд╕реЗ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: рдпрд╣ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрдВрддреНрд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдЙрдиреНрд╣реЗрдВ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╡рд┐рдЪрд╛рд░ рднреА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рдФрд░ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реЛрдиреЗ рд▓рдЧрддрд╛ рд╣реИ ... рд▓реЗрдХрд┐рди! рдпрджрд┐ рдЖрдкрдХреЛ рд╕реЗрдЯрд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рддреНрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддреЛ рдХреНрдпрд╛ рдХрд░реЗрдВ: рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рд╛рдЗрдЯ рд▓реЛрдЧреЛ? рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд┐рдХрд▓рд╛, django-dbsettings рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдореВрд▓реНрдп рдХрд╛
рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ ред
рдореИрдВрдиреЗ django-dbsettings рдореЗрдВ
ImageValue рд╕рдорд░реНрдерди рдХреИрд╕реЗ рдЬреЛрдбрд╝рд╛, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВ рдмрддрд╛рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВред
рдкреНрд░рд╛рдЧрд┐рддрд┐рд╣рд╛рд╕
рдЬрдм рдореБрдЭреЗ рд╕реЗрдЯрд┐рдВрдЧ рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛, рддреЛ рдореБрдЭреЗ django-values тАЛтАЛрдкрд░рд┐рдпреЛрдЬрдирд╛ рдорд┐рд▓реА, рдЬреЛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╣реЛ рдЧрдИред рдЙрд╕рдХреЗ рд╕рд╛рде рдкреАрдбрд╝рд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдЙрд╕рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░ django-dbsettings рд░рдЦрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ github рдЪрд▓рд╛ рдЧрдпрд╛ред
рдЧреАрддрд╛рдм рдкрд░ 20 рдХрд╛рдВрдЯреЗ рдереЗред рдЙрдирдореЗрдВ рд╕реЗ рдХрдИ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ рдкрд┐рдЫрд▓реЗ рдЕрджреНрдпрддрди рдХрд┐рдП рдЧрдП рдПрдХ рдкрд░ рд░реБрдХ рдЧрдпрд╛ред рд╡рд╣ рдПрдХ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдмрди рдЧрдпрд╛ рдФрд░ рдкрд╣рд▓реА рдмрд╛рд░ рдЬрд╛рджреВ рдХреЗ рдмрд┐рдирд╛ рдШрд╛рдпрд▓ рд╣реЛ рдЧрдпрд╛ред рдПрдХрдорд╛рддреНрд░ рд╕рдорд╕реНрдпрд╛ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ "рдкрд┐рдХреНрдЪрд░" рдкреНрд░рдХрд╛рд░ рдХреА рдХрдореА рдереАред
рджреЛ рд╡рд┐рдХрд▓реНрдк рдереЗ: рдпрд╛ рддреЛ рдЪрд┐рддреНрд░реЛрдВ рдХреЛ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдмреИрд╕рд╛рдЦреА рдмрдирд╛рдПрдВ, рдпрд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдХрд╛рдВрдЯрд╛ рдХрд░реЗрдВ рдФрд░ рд╕рдм рдХреБрдЫ рдЦреВрдмрд╕реВрд░рддреА рд╕реЗ рдХрд░реЗрдВред рдЪреБрдирд╛рд╡ рд╕реНрдкрд╖реНрдЯ рдерд╛ред
рд▓рдХреНрд╖реНрдпреЛрдВ
рдЗрд╕ рд▓реЗрдЦ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХрдИ рдереЗ:
- рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ django-dbsettings рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЖрдк рдореЗрдВ рд╕реЗ рдЬрд┐рдирдХреЛ рдЕрдкрдиреЗ _settings_ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рд╡реЗ рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдХреЛрдб рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рджрд┐рди рдЦрд░реНрдЪ рди рдХрд░реЗрдВ;
- рджреВрд╕рд░реА рдмрд╛рдд, рдореИрдВ рдЕрдкрдиреЗ рдкрд╛рдардХреЛрдВ (рдмрд▓реНрдХрд┐, "рдХреЛрдб рд▓реЗрдЦрдХреЛрдВ" рдХреЗ рд▓рд┐рдП рднреА) рдЕрдкрдиреА рдЗрдЪреНрдЫрд╛ рд╡реНрдпрдХреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛: рдЬрдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рддреЛ рд░реБрдХрдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рд┐рдП! рдЬрдм рддрдХ рдЖрдк рдЕрдкрдиреЗ "рджрд┐рдорд╛рдЧ рдХреА рдЙрдкрдЬ" рдХреЗ рд▓рд┐рдП рдЧрд░реНрд╡ рдФрд░ рд╕реМрдВрджрд░реНрдп рд╕рдВрддреБрд╖реНрдЯрд┐ рдХреА рднрд╛рд╡рдирд╛ рдорд╣рд╕реВрд╕ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддрдм рддрдХ рдЕрдкрдиреЗ рдХреЛрдб рдХреА рд╕рдореАрдХреНрд╖рд╛ рдФрд░ рд╕реБрдзрд╛рд░ рдЬрд╛рд░реА рд░рдЦреЗрдВ (рд▓реЗрдХрд┐рди рдХрдЯреНрдЯрд░рддрд╛ рди рд▓рд╛рдПрдВ: "рдЗрд╕реЗ рд╕рд░рд▓ рд░рдЦреЗрдВ" ┬й);
- рд▓реЗрдЦ рдПрдХ рдУрдкрди рд╕реЛрд░реНрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдХреИрд╕реЗ рдЖрдкрдХреЗ рдХрд╛рдо рдХреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд╢реИрд▓реА рдФрд░ рддрд░реНрдХ рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдлрд┐рдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЕрдиреНрдп рд╕рд┐рд╕реНрдЯрдо рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдореЗрдВ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореЗрд░рд╛ рдирд┐рд░реНрдгрдп рддреБрд░рдВрдд рдпрд╣рд╛рдБ рдкреНрд░рд╕реНрддреБрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛: рдкрд╣рд▓реЗ, рдЕрдиреНрдп рдлрд╛рдЗрд▓реЗрдВ рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реБрдИрдВ; рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд ifs рдФрд░ рд╡рд┐рд░рд╛рд╕рдд рдЖрджрд┐ рдереЗ, рд▓реЗрдХрд┐рди, рдкрд┐рдЫрд▓реЗ рдмрд┐рдВрджреБ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддреЗ рд╣реБрдП, рдХреЛрдб рдХреЛ рдХрдо рд╕реЗ рдХрдо рдФрд░ рд╕реНрдерд╛рдиреАрдп рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рдерд╛ред
рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╕рдВрд░рдЪрдирд╛
(рдмреЛрд▓реНрдб рдлрд╛рдЗрд▓реЗрдВ рдЬрд┐рд╕рдореЗрдВ рдЖрдкрдХреЛ ImageValue рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрджрд▓рд╛рд╡ рдХрд░рдиреЗ рдереЗ)
- рдЯреЗрдореНрдкреНрд▓реЗрдЯ / - рдореЗрдВ рджреЛ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╣реЛрддреЗ рд╣реИрдВ: рд╕рдВрдкреВрд░реНрдг рд╕рд╛рдЗрдЯ рдХреА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдФрд░ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рджреЗрдЦрдиреЗ рдФрд░ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
- рдкрд░реАрдХреНрд╖рдг / - рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рд╢рд╛рдорд┐рд▓ рд╣реИрдВ
- __init__.py
- dbsettings.txt - рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдВ (рдпрд╣ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдП)
- form.py - рд╕рдВрдкрд╛рджрди рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд▓рд┐рдП рдлрд╛рд░реНрдо рдирд┐рд░реНрдорд╛рддрд╛
- group.py - рд╕реЗрдЯрд┐рдВрдЧ рд╕рдореВрд╣ рдХреЗ рд╡рд░реНрдЧ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдПрдХреНрд╕реЗрд╕ рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ
- loading.py - рдЗрд╕рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрдВрдХреНрд╢рди рд╣реИрдВ (рдРрдб, рд╕реЗрд╡, рд░реАрдб рд╕реЗрдЯрд┐рдВрдЧреНрд╕)
- model.py - рд╕реЗрдЯрд┐рдВрдЧ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдореЙрдбрд▓ рд╣реЛрддрд╛ рд╣реИ
- urls.py - рдЗрд╕рдореЗрдВ рд╕реЗрдЯрд┐рдВрдЧ рдкреГрд╖реНрда рджреЗрдЦрдиреЗ рдФрд░ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпреВрдЖрд░рдПрд▓ рд╣реИрдВ
- utils.py - рдЗрд╕рдореЗрдВ syncdb рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╕рдордп рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рд╕реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рд╣реЛрддрд╛ рд╣реИ
- values.py - рдЗрд╕рдореЗрдВ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╡рд┐рд╡рд░рдг рд╣реЛрддрд╛ рд╣реИ
- view.py - рдЗрд╕рдореЗрдВ рджреГрд╢реНрдп / рд╕рдВрдкрд╛рджрди рдХрд╛ рд╡рд┐рд╡рд░рдг рд╣реЛрддрд╛ рд╣реИ
рд╣рдо рдХреНрдпрд╛ рдпрд╛рдж рдХрд░ рд░рд╣реЗ рд╣реИрдВ?
рдореИрдВ рдкреИрдЪ рд░реВрдк рдореЗрдВ рдХрд┐рдП рдЧрдП рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рджрд┐рдЦрд╛рдКрдВрдЧрд╛: "
- " - рд╣рдЯрд╛рдИ рдЧрдИ рд░реЗрдЦрд╛, "
+ " - рдЬреЛрдбрд╝реА рдЧрдИ рд░реЗрдЦрд╛ред
рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕
-<form method="post"> +<form enctype="multipart/form-data" method="post"> ... </form>
Django-dbsettings рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рдлрд╝реЙрд░реНрдо рд╡рд┐рд╡рд░рдг рдореЗрдВ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝реЙрд░реНрдо рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, рдФрд░ рджреГрд╢реНрдп рдЙрдиреНрд╣реЗрдВ
рдЕрдиреБрд░реЛрдз рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛ред
рдкреНрд░рдХрд╛рд░
... if request.method == 'POST':
рдорд╛рдиреНрдпрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЧрдИ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдФрд░ рджрд░реНрдЬ рдХрд┐рдП рдЧрдП рдЕрдиреНрдп рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде
form.cleaned_data рдореЗрдВ рдЧрд┐рд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдлреЙрд░реНрдо рдмрдирд╛рддреЗ рд╕рдордп рдЕрдиреБрд░реЛрдзреЛрдВ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЗрд╕реЗ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рдкреНрд░рдХрд╛рд░
рд╣рдо рдЗрд╕ рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдзреНрдпрд╛рди рджреЗрдВрдЧреЗред
рдорд╛рдиреЛрдВ рдХреА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд▓рд┐рдП рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рдХрд╛ рд╡рд┐рд╡рд░рдг рд╣реЛрддрд╛ рд╣реИред рдмрд╛рдХреА рд╕рднреА рдЪреАрдЬрд╝реЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕рдореЗрдВ рддреАрди рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рд╕рднреА рдмрд╛рд▓ рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:
... class Value(object): ... def to_python(self, value): """ native-python , """ return value def get_db_prep_save(self, value): """ pre-save , CharField """ return unicode(value) def to_editor(self, value): """ , """ return unicode(value) ...
рд╕рд╛рде рд╣реА, рдорд╛рди рд╡рд░реНрдЧ рдореЗрдВ рдПрдХ
рдлрд╝реАрд▓реНрдб рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕рдореЗрдВ рдЗрд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдкрддреНрд░ рдлрд╝реАрд▓реНрдб рд╡рд░реНрдЧ (рдЬреИрд╕реЗ django.forms.FileInput) рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЖрдкрдХрд╛ рдореВрд▓реНрдп рд▓реЗрдЦрди
class ImageValue(Value): def __init__(self, *args, **kwargs): if 'upload_to' in kwargs: self._upload_to = kwargs['upload_to'] del kwargs['upload_to'] super(ImageValue, self).__init__(*args, **kwargs) ...
рд╣рдо рдмреЗрд╕ рдХреНрд▓рд╛рд╕
рд╡реИрд▓реНрдпреВ рд╕реЗ рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░реЗрдВрдЧреЗ, рд╣рдорд╛рд░реЗ
upload_to рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░реЗрдВрдЧреЗ
рддрд╛рдХрд┐ рдЖрдк IMAGE_ROOT рдореЗрдВ рд╕рдмрдлрд╝реЛрд▓реНрдбрд░ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд╕рдХреЗрдВ рдЬрд┐рд╕рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЪрд┐рддреНрд░ рдЕрдкрд▓реЛрдб рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред
рд╣рдо _setting_ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдЪрд░рдгреЛрдВ рдореЗрдВ рдореВрд▓реНрдп рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рддрд░реАрдХреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред
рдЖрдЗрдП рдЗрдореЗрдЬ рдХреЛ рд▓реЛрдб рдХрд░рдХреЗ рдФрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕реЗрд╡ рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░реЗрдВред
from os.path import join as pjoin class ImageValue(Value): ... def get_db_prep_save(self, value): if not value: return None hashed_name = md5(unicode(time.time())).hexdigest() + value.name[-4:] image_path = pjoin(self._upload_to, hashed_name) dest_name = pjoin(settings.MEDIA_ROOT, image_path) with open(dest_name, 'wb+') as dest_file: for chunk in value.chunks(): dest_file.write(chunk) return unicode(image_path) ...
рдорд╛рди рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ
django.core.files.uploadedfile рд╕реЗ
UploadedFile рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИред рдпрд╣ рдПрдХ рдорд╛рдирдХ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ рдЬреЛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рддреЗ рд╕рдордп рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░
рдЕрдиреБрд░реЛрдз рдореЗрдВ рдЖрддрд╛ рд╣реИред
рд╡рд┐рдзрд┐ рд╕рд░рд▓ рдЯреНрд░рд┐рдХреНрд╕ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рддреА рд╣реИ: рдпрд╣ рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдмрдирд╛рддрд╛ рд╣реИ, рдФрд░ рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЧрдИ рдлрд╝рд╛рдЗрд▓ рдХреЛ
рд╕реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ
self._upload_to рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред рд╡рд┐рдзрд┐
рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдЪрд┐рддреНрд░ рдХреЗ рд▓рд┐рдП рдкрде рджреЗрддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╕реЗрдЯрд┐рдВрдЧ рдЗрд╕ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рднреА рдорд┐рд▓рддреА рд╣реИред
рдЕрдм рдЙрд▓рдЯрд╛ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рддреЗ рд╣реИрдВ: рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд░рд┐рдХреЙрд░реНрдб рд╕реЗ рдкрд┐рдХреНрдЪрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рд╡рд┐рдзрд┐ рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ:
class ImageValue(Value): ... def to_editor(self, value): if not value: return None file_name = pjoin(settings.MEDIA_ROOT, value) try: with open(file_name, 'rb') as f: uploaded_file = SimpleUploadedFile(value, f.read(), 'image')
рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд░рд┐рд╡рд░реНрд╕ рдСрд░реНрдбрд░ рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: рд╣рдо рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рд▓рд┐рдП рдЧрдП рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдЫрд╡рд┐ рдХреЗ рд▓рд┐рдП рдкрде рдмрдирд╛рддреЗ рд╣реИрдВ,
рд╕рд┐рдВрдкрд▓рдСрдЙрдЯрд▓реЛрдбреЗрдбрдлрд╝рд╛рдЗрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░
рдЙрд╕рдореЗрдВ рдЫрд╡рд┐ рдлрд╝рд╛рдЗрд▓ рдкрдврд╝рддреЗ рд╣реИрдВред
рдореИрдВ рд╕рдордЭрд╛рдКрдВрдЧрд╛ рдХрд┐ рд▓рд╛рдЗрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ:
uploaded_file.__dict__['_name'] = value
рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЕрдкрд▓реЛрдб рдХреА
рдЧрдИ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдмреЗрд╕ рдХреНрд▓рд╛рд╕
UploadedFile рдореЗрдВ рдирд╛рдо рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реЗрдЯрд░ рд╣реИ, рдЬреЛ рдХреЗрд╡рд▓ рдкрде рд╕реЗ рдХреЗрд╡рд▓ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдХреЛ
рдХрд╛рдЯ рджреЗрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ
self._name рдореЗрдВ
рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ , рдФрд░
рдЧреЗрдЯреНрдЯрд░ рдЗрд╕ рдорд╛рди рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рд╕реЗ рдЪрд┐рддреНрд░ рдХреЗ рд▓рд┐рдП рд░рд╛рд╕реНрддрд╛ рд▓рд┐рдЦрдирд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╣реИ рдЗрд╕реЗ рдлрд╝реЙрд░реНрдо рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╡рд┐рдЬреЗрдЯ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ред
рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рдзрд┐ рдмрдиреА рд╣реБрдИ рд╣реИ рдЬреЛ рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд╕реНрддреБ рд▓реМрдЯрд╛рддреА рд╣реИред рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рд╡рд░реНрддрдорд╛рди рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдЕрдиреБрд░реЛрдз рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдореВрд▓реНрдп рдХреА рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╕рдордп рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддрд╛рдХрд┐ рдлрд╛рдЗрд▓ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рди рд╣реЛред рдпрд╣рд╛рдБ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ:
class ImageValue(Value): ... def to_python(self, value): return unicode(value) ...
рдПрдХ рдЕрдВрддрд┐рдо рд╕реНрдкрд░реНрд╢ рд╣реИ: рдЖрдкрдХрд╛ рд╡рд┐рдЬреЗрдЯ, рдЬреЛ рдорд╛рдирдХ рдлрд╝рд╛рдЗрд▓ рдЕрдкрд▓реЛрдб рдмрдЯрди рдХреЗ рдмрдЧрд▓ рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рд╡рд░реНрддрдорд╛рди рдЪрд┐рддреНрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛ред
class ImageValue(Value): ... class field(forms.ImageField): class widget(forms.FileInput): "Widget with preview" def __init__(self, attrs={}): forms.FileInput.__init__(self, attrs) def render(self, name, value, attrs=None): output = [] try: if not value: raise IOError('No value') Image.open(value.file) file_name = pjoin(settings.MEDIA_URL, value.name) output.append(u'<p><img src="{}" width="100" /></p>'.format(file_name)) except IOError: pass output.append(forms.FileInput.render(self, name, value, attrs)) return mark_safe(''.join(output)) ...
рд╣рдо рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛
рдлрд╝реАрд▓реНрдб рдХреНрд▓рд╛рд╕ рдмрдирд╛рддреЗ рд╣реИрдВ, рдФрд░ рдЙрд╕рдореЗрдВ - рдорд╛рдирдХ
FileInput рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рдПрдХ
рд╡рд┐рдЬреЗрдЯ ред рд╣рдо
рд░реЗрдВрдбрд░ рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддреЗ
рд╣реИрдВ , рдЬреЛ рд╣рдорд╛рд░реЗ рдЗрдирдкреБрдЯ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ, рдЬреЛ рд╕рдВрдмрдВрдзрд┐рдд html рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред
Image.open(value.file)
рдпрд╣ рд▓рд╛рдЗрди рдПрдХ рд╕рд╛рде рджреЛ рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдВрдЪ рдХрд░рддреА рд╣реИ: рдХреНрдпрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдлрд╝рд╛рдЗрд▓ рдореМрдЬреВрдж рд╣реИ рдФрд░ рдХреНрдпрд╛ рдпрд╣ рдПрдХ рдЫрд╡рд┐ рд╣реИ, рджреЛрдиреЛрдВ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдпрд╣ рдПрдХ
IOError рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХ рд╕рдХрддрд╛ рд╣реИред
Mark_safe () рдлрд╝рдВрдХреНрд╢рди HTML рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрдВрдХреНрддрд┐ рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ (рдЗрд╕рдХреЗ рдмрд┐рдирд╛, рд╣рдорд╛рд░реЗ рд╡рд┐рдЬреЗрдЯ рдХрд╛ рдХреЛрдб рдХреЗрд╡рд▓ рдкреГрд╖реНрда рдкрд░ рдПрдХ рдкрдВрдХреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛)ред
рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

рд╕рдВрджрд░реНрдн
django-dbsettings on github.comрдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред
рдкреБрдирд╢реНрдЪ
рдореИрдВ рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╡реНрдпрд╡рд╕рд╛рдп рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧ рдЕрдкрдиреА рдЗрдЪреНрдЫрд╛рдУрдВ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░реЗрдВ рдпрд╛ рдмрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╢рд┐рдХрд╛рдпрдд рдХрд░реЗрдВред