рдкрд╛рди рд▓реМрдХреА рд╕реЗ рд░реЗрд╕рд┐рдкреА

рд╣рд╛рд▓ рд╣реА рдореЗрдВ PanGurman рд░реЗрд╕реНрддрд░рд╛рдВ рдХреА рдмреБрдХрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реЗрд╡рд╛ рд╢реБрд░реВ рдХреА рд╣реИред рдЗрд╕рдХреЗ рдЕрдВрджрд░ рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ django рд╕рд╛рдЗрдЯ рд╣реИред рдореИрдВ рдЖрдкрдХреЛ рдпрд╣ рдмрддрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рдЪрд┐рддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде) рд▓реЗрдЦ рдореЗрдВ рд╕реБрдкрд░-рдЪрд╛рд▓рд╛рдХ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдХреБрдЫ рдЪрд╛рд▓ рдпрд╛ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдЙрдкрдпреЛрдЧреА рдкрд╛рдПрдЧрд╛ рдФрд░ рдЬреАрд╡рди рдХреЛ рдХрд┐рд╕реА рддрд░рд╣ рдЖрд╕рд╛рди рдмрдирд╛ рджреЗрдЧрд╛ред

рдорд╛рдирдХ рдЯреВрд▓рдмреЙрдХреНрд╕ PostgreSQL, Django 1.4 (+ GeoDjango), рд╕рдВрддрд░реА, рдЕрдЬрд╡рд╛рдЗрди (+ рд░реЗрдбрд┐рд╕), рдлреИрдмреНрд░рд┐рдХ рд╣реИред

рдкреНрд░рд╛рд░рдВрдн рдкреГрд╖реНрда


рдЫрд╡рд┐

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

рдЬрдм рдЖрдк рдкрдВрдЬреАрдХрд░рдг рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рдмрдзрд╛рдИ рдкрддреНрд░ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕реЗ html рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред Html- рдкрддреНрд░ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рдЯреЗрдореНрдкреНрд▓реЗрдЯреЗрдб-рдИрдореЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ: рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рдПрдХ рдИрдореЗрд▓ рдлрд╝реЛрд▓реНрдбрд░ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рдЕрдХреНрд╖рд░ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдкрддреНрд░ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ 3 рдлрд╛рдЗрд▓реЗрдВ рд╣реЛрддреА рд╣реИрдВ: email.html (рдкрддреНрд░ рдХрд╛ HTML-рд╕рдВрд╕реНрдХрд░рдг), email.txt (рдкрддреНрд░ рдХрд╛ рдкрд╛рда рд╕рдВрд╕реНрдХрд░рдг) рдФрд░ short.txt (рд╡рд┐рд╖рдп)ред

рдЫрд╡рд┐

рдкрддреНрд░ рдЗрд╕ рддрд░рд╣ рднреЗрдЬреЗ рдЬрд╛рддреЗ рд╣реИрдВ:
send_templated_email([user], 'emails/activation', context=context) 

рдЖрдк рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛рдУрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдпрд╛ рд╕рд┐рд░реНрдл рдИрдореЗрд▓ рдкрддреЗ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВред рдмрдХрд╡рд╛рд╕, рд▓реЗрдХрд┐рди рд╕рд░рд▓ рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ, рд╣рдо рд╡рд┐рднрд┐рдиреНрди рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдкрд░ рдХрд╛рдлреА рд╕рдордп рд╕реЗ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

Html-рдЕрдХреНрд╖рд░реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдФрд░ рд╕рдорд╕реНрдпрд╛ рд╣реИ - рдпрд╣ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЦреБрдж рдХреЛ рд▓рдЧрд╛рддрд╛рд░ рднреЗрдЬреЗ рдмрд┐рдирд╛ рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреМрд░рд╛рди рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рджреЗрдЦрдирд╛ рд╣реИред рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо django-eml-email-backend (рдПрдХ рдИрдореЗрд▓ рдмреИрдХрдПрдВрдб рдХреЗ рд╕рд╛рде рдПрдХ рдбрдВрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рднреЗрдЬрдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЗрдорд▓рд╛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЕрдХреНрд╖рд░ рдмрдЪрд╛рддрд╛ рд╣реИ)ред рдЕрдзрд┐рдХрд╛рдВрд╢ рдИрдореЗрд▓ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмрд┐рдирд╛ рдИрдПрдордПрд▓ рдлрд╛рдЗрд▓реЗрдВ рдЦреЛрд▓рддреЗ рд╣реИрдВ (рдЕрдВрддрд░рд┐рдХреНрд╖ рджреНрд╡рд╛рд░рд╛ рдкреЙрдк-рдЕрдк рдкрд░ рднреА рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рд╣реИ)ред

рдареАрдХ рд╣реИ, рдЬрд╝рд░реАрдЧрд┐рд╕


рдПрдХ рдЦрд╛рддреЗ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдФрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдПрдХ рд╡реНрдпрдХреНрддрд┐ рдореБрдЦреНрдп рдкреГрд╖реНрда рдкрд░ рдкрд╣реБрдВрдЪ рдЬрд╛рддрд╛ рд╣реИред

рдЫрд╡рд┐

рдЙрд╕ рдкрд░ рдЖрдк рдЦреЛрдЬ рдлрд╝реЙрд░реНрдо рдкрд░ рдзреНрдпрд╛рди рджреЗ рд╕рдХрддреЗ рд╣реИрдВред

рдЫрд╡рд┐

рддрддреНрд╡реЛрдВ рдХреЛ рдореВрд▓ рд░реВрдк рд╕реЗ рдЗрд╕ рддрд░рд╣ рд░рдЦрд╛ рдЧрдпрд╛ рдерд╛:

  <div class="b-filter_selector time"> <select name="persons" data-behavior="Chosen"> <option value="1">1 </option> <option value="2" selected="selected>2 </option> <option value="3">3 </option> </select> </div> 


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

рдЕрдЬрдЧрд░ рдХреЛрдб рдореЗрдВ рд╕реАрдЯреАрдПрдо рдЦрд░рд╛рдм рд╕реНрд╡рд╛рдж рд╣реИ, html рдХреЛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЬрдВрдЧ рдореЗрдВ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдлрд╛рд░реНрдо рддрддреНрд╡реЛрдВ рдХреЗ рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рд╛рдорд╛рдиреНрдп рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЙрдкрдХрд░рдг рдирд╣реАрдВ рд╣реИ (рдФрд░ рдпрд╣рд╛рдВ рд╣рдореЗрдВ рдлрд╝реАрд▓реНрдб рдореЗрдВ рдбреЗрдЯрд╛-рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ)ред рдЗрд╕ рддрд░рд╣ рдХреА рдЪреАрдЬреЛрдВ рдХреЗ рдХрд╛рд░рдг, рд╣рдо рд▓реЗрдЖрдЙрдЯ рдХреЛ рд╕реНрдХреНрд░реВ рдХрд░рддреЗ рд╕рдордп django-widget-tweaks ( bitbucket , github ) рдХрд╛ рдмрд╣реБрдд рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реНрдХреНрд░реВ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рд░рд▓ рдФрд░ рдбреА-рд╣рд╛рд░реНрдб рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

 <div class="b-filter_selector time"> {% render_field search_form.persons data-behavior='Chosen' %} </div> 


рдпрджрд┐ рдЖрдкрдХреЛ рдлрд╝реАрд▓реНрдб рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдирдХ рдмрдВрдзрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд╣рдо рдПрдХ html рд╕реНрдирд┐рдкреЗрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдмрд╛рдж рдореЗрдВ {% рд╢рд╛рдорд┐рд▓%} (рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

  {% comment %} : {% include "inc/input.html" with field=form.query div_classes="search" no_label=0 %} {% endcomment %} {% load widget_tweaks %} {% if no_label != 1 %}{{ field.label_tag }}{% endif %} <div class="b-input {{ div_classes }} {% if field.errors %}error{% endif %}"> {{ field|add_class:'b-input_input' }} </div> 

рд╡рд╣реА рдПрд░рд░ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рдЬрд╛рддрд╛ рд╣реИред

django-widget-tweaks рд╕реЗ {% render_field %} рдореМрдЬреВрджрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖рддрд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реАрдПрд╕рдПрд╕ рдХрдХреНрд╖рд╛рдПрдВ) рднреА рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:

  {% render_field form.emails rows="2" class+="b-input_textarea gray" autofocus="" %} {% include "inc/errors.html" with errors=form.emails.errors %} 


рдЖрдЬ рдЙрдкрд▓рдмреНрдз рдмреНрд▓реЙрдХ


рдЫрд╡рд┐

рдЗрд╕ рдмреНрд▓реЙрдХ рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 5 рд░реЗрд╕реНрддрд░рд╛рдВ рд╣реИрдВ рдЬреЛ рдЖрдЬ рдмреБрдХрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИрдВред рд╡реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддреЗ рд╣реИрдВ:

 restaurants = Restaurant.objects.enabled().free_today_in_city(city).prefetch_related('scenes')[:5] 


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рддрд░реАрдХреЛрдВ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдпрд╣рд╛рдБ ( .enabled().free_today_in_city(city) ) рдореЗрдВ .enabled().free_today_in_city(city) ред рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд dzhangovsky рджреГрд╖реНрдЯрд┐рдХреЛрдг - рдкреНрд░рдмрдВрдзрдХ рдХреЛ рдРрд╕реЗ рдЯреБрдХрдбрд╝реЗ рд▓реЗрдирд╛ - рдпрд╣ рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рдмрдВрдзрдХ рд╡рд┐рдзрд┐рдпрд╛рдВ рдПрдХ рдХреНрд╡реЗрд░реАрд╕ рд▓реМрдЯрд╛рддреА рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреЛрдИ рдХрд╕реНрдЯрдо рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реИ - рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдЖрдк рдХреЗрд╡рд▓ рдЕрдкрдиреЗ рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ 1 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕ рд╕реАрдорд╛ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, django-model-utils рд╕реЗ PassThroughManager рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ рдПрдХ рдкреНрд░рдмрдВрдзрдХ рдХреЗ рдмрдЬрд╛рдп рдПрдХ QuerySet рд▓рд┐рдЦреЗрдВ:

  class RestaurantQueryset(QuerySet): def enabled(self): return self.filter(enabled=True) def free_today_in_city(self, city): today = city.now().date() return self.filter(city=city).free(today) def free(self, date): # ... class Restaurant(models.Model): # ... objects = PassThroughManager.for_queryset_class(RestaurantQueryset)() 


рдРрд╕реЗ "рд╕реНрдЯреЗрд░реЙрдпрдб рдкрд░ рдкреНрд░рдмрдВрдзрдХ" рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВ (рдореИрдВрдиреЗ рдПрдХ рддрд╕реНрд╡реАрд░ рдирд╣реАрдВ рд▓реЗрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ :))ред рд╣рдо рдорд╛рдирдХ рдкреНрд░рдмрдВрдзрдХреЛрдВ рдХреЗ рдмрдЬрд╛рдп рдкреВрд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

"рд╕рднреА рджреЗрдЦреЗрдВ" рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ


... рдФрд░ рд╣рдо рд░реЗрд╕реНрддрд░рд╛рдВ рдХреА рдПрдХ рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рдкреГрд╖реНрда рдкрд░ рдЖрддреЗ рд╣реИрдВред рдпрд╣ рдкреГрд╖реНрда рдПрдХ рд╢рд╛рдирджрд╛рд░ рдЦреЛрдЬ рдлрд╝реЙрд░реНрдо рд╣реИ, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдо Ajax рджреНрд╡рд╛рд░рд╛ рдЕрдкрдбреЗрдЯ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

рдЫрд╡рд┐

рдореЗрд░реЗ рдкрд╛рд╕ js рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЫреЛрдЯрд╛ рд╡реНрдпрдХреНрддрд┐рдЧрдд "рд╕рдирдХ" рд╣реИ: рд╕рд╛рдЗрдЯ рдХреЛ рдмрд┐рдирд╛ js рдХреЗ рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрдиреЗ рдкрд░ рдХреБрдЫ рдлрд╛рдпрджреЗ рджреЗрддрд╛ рд╣реИред рд╕реНрдкрд╖реНрдЯ рд▓реЛрдЧреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛ (js рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рд╕рд╛рдЗрдЯ рдХреЛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдирд╣реАрдВ рдмрдирд╛рддреА рд╣реИ) рдХрдо рд╕реНрдкрд╖реНрдЯ рднреА рд╣реИрдВ: рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдРрд╕реА рд╕рд╛рдЗрдЯ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ (рдЖрдк рдЗрд╕реЗ рд╕реЗрд▓реЗрдирд┐рдпрдо рдХреЗ рдмрд┐рдирд╛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЬрд╛рдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ) + рдЗрд╕реЗ рд▓рд┐рдЦрдирд╛ рдЖрд╕рд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

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

  {% extends 'base.html' %} <!-- : ,     --> ... <div class="b-search-results_result"> {% include 'restaurants/ajax/list.html' %} </div> ... <!-- :  ,    --> 


рдЕрдЬрд╛рдХреНрд╕ рдкреИрдЯрд░реНрди:

  <ul class="b-search-results_result_list"> {% for restaurant in restaurants %} <li>...</li> {% endfor %} </ul> 


рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЪрдпрди request.is_ajax () рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ; рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдШреЛрд╖рдгрд╛рддреНрдордХ js рд╣реИ, рдЬреЛ рдХрд┐рд╕реА рднреА рд╕рд╛рдзрд╛рд░рдг HTML рдлреЙрд░реНрдо рдХреЛ ajax рдореЗрдВ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ:

  def restaurant_list(request, city_slug): # ... response = TemplateResponse(request, 'restaurants/list.html', {...}) if request.is_ajax(): response.template_name = 'restaurants/ajax/list.html' return response 


PanGurman рдореЗрдВ, рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рд╕рд╛рде рдереЛрдбрд╝рд╛ рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдпрд╣ @ajax_template рдбреЗрдХреЛрд░реЗрдЯрд░ рдерд╛, рдЬрд┐рд╕рдиреЗ рд╡реНрдпреВ рдореЗрдВ рдЕрдЬрд╛рдХреНрд╕ рдЬреЛрдбрд╝рд╛:

  @ajax_template('restaurants/ajax/list.html') def restaurant_list(request, city_slug): # ... return TemplateResponse(request, 'restaurants/list.html', {...}) 


рдпрд╛рдиреА рдЖрдк рдбреЗрдХреЛрд░реЗрдЯрд░ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рджреГрд╢реНрдп рдХреЛ рд▓рдкреЗрдЯрддреЗ рд╣реИрдВ, рдкреНрд░рдкрддреНрд░ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛-рд╡рд┐рд╢реЗрд╖рддрд╛ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рд╣реИ: рдлрд╝реЙрд░реНрдо рдРрдЬреИрдХреНрд╕ рдмрди рдЬрд╛рддрд╛ рд╣реИред

рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд┐рдХрд▓реНрдк 'restaurants/(ajax/)?list.html' рджреЛрд╣рд░рд╛рддрд╛ рд╣реИ (рдЬреЛ рдкрд░реЗрд╢рд╛рди рдХрд░рддрд╛ рд╣реИ рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдПрдХ рд╕реНрд░реЛрдд рд╣реИ), + рджреГрд╢реНрдп рдореЗрдВ рдХрдИ рд╡рд╛рдкрд╕реА рдмрд┐рдВрджреБ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рдм рдХреБрдЫ рдЕрдЬрд╛рдХреНрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ (рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╡рд┐рдХрд▓реНрдк рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЬрд╛рдВрдЪ рдХреЗ рдмрд┐рдирд╛ рдмрджрддрд░ рд╣реИ) рдбреЗрдХреЛрд░реЗрдЯрд░)ред

рдЗрд╕рд▓рд┐рдП, рдЙрдиреНрд╣реЛрдВрдиреЗ @ajax_template рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛ рдФрд░ рдЕрдм рддрдХ рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдкрд░ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рд╣реИ:

  def restaurant_list(request, city_slug): # ... return show(request, 'restaurants/list.html', {...}) 


рд╢реЛ TemplateResponse рдХрд╛ рд╡рдВрд╢рдЬ рд╣реИ, рдЬреЛ, рдЕрдЬрд╛рдХреНрд╕ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реЗ рдЕрдЬрд╛рдХреНрд╕ рд╕рдмрдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЯреЗрдореНрдкрд▓реЗрдЯ рдЖрдЬрд╝рдорд╛рддрд╛ рд╣реИред Https://gist.github.com/2416695 рджреЗрдЦреЗрдВ

рд╢реЛ рдореЗрдВ рдХреБрдЫ рдФрд░ рд╡рд┐рдзрд┐рдпрд╛рдВ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВрдиреЗ рд╣рдореЗрд╢рд╛ рдпрд╛рдж рдХрд┐рдпрд╛ - рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреЗ рд╕рд╛рде рдХреБрдЫ рд╕реВрдХреНрд╖реНрдорддрд╛рдПрдВ рд╣реИрдВ рдФрд░ рд╕рдм рдХреБрдЫ рдЕрджреНрднреБрдд рдирд╣реАрдВ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, .with_context рдЧрд┐рд░ рдЬрд╛рдПрдЧрд╛ рдпрджрд┐ рдкрд┐рдЫрд▓реЗ рджреГрд╢реНрдп рдиреЗ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рд╣реИ), рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХрд╛рдлреА рд╕рдВрднрд╡ рд╣реИ (рдФрд░ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рдЕрдЬрд╛рдХреНрд╕ рд╕реЗ рдмрд╣реБрдд рдХрдо рд╕рдВрдмрдВрдз рд╣реИ)ред

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

рдХреБрдЫ рдорд┐рд▓рд╛, рдПрдХ рд░реЗрд╕реНрддрд░рд╛рдВ рдореЗрдВ рдкреНрд░рд╣рд╛рд░ рдХрд┐рдпрд╛


рд╣рдо рд░реЗрд╕реНрддрд░рд╛рдВ рдкреГрд╖реНрда рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВред

рдЫрд╡рд┐

рдЗрд╕рдХрд╛ рдПрдХ рдЕрдЬрд╛рдХреНрд╕ рднреА рд╣реИ (рдЖрджреЗрд╢ рд░реВрдк рдореЗрдВ, рдЙрдкрд▓рдмреНрдз рд╕рдордп рдХреЛ рдЕрдЬрд╛рдХреНрд╕-рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдВрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИ), рд▓реЗрдХрд┐рди рдЗрд╕реЗ рджреВрд╕рд░реЗ рддрд░реАрдХреЗ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ :)

рдХреИрд▓реЗрдВрдбрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ (js рдХреЗ рдмрд┐рдирд╛ рд╕рд╛рдорд╛рдиреНрдп рдЗрдирдкреБрдЯ рдлрд╝реАрд▓реНрдб рд╣реЛрдВрдЧреЗ) рдФрд░ рдЗрд╕рд▓рд┐рдП рд╕рд░реНрд╡рд░ рд╕реЗ json, html рдирд╣реАрдВ, рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред Django-tastypie рдХреА рдорджрдж рд╕реЗ, рдореИрдВрдиреЗ рдЬрд▓реНрджреА рд╕реЗ API рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛, рдФрд░ рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд╛рдВрдЫрд┐рдд рд╡реНрдпрдХреНрддрд┐ рдХреЛ json рджрд┐рдпрд╛ рдЧрдпрд╛ред рдпрд╣ рдЖрдкрдХреЗ рд╣рд╛рдереЛрдВ рд╕реЗ json рджреЗрдиреЗ рд╡рд╛рд▓рд╛ рджреГрд╢реНрдп рд▓рд┐рдЦрдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд▓рдВрдмрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдкреАрдЖрдИ рд╡реИрд╕реЗ рднреА рдХрд╛рдо рдЖрдПрдЧрд╛ + рд╣рдореЗрдВ рдереНрд░реЙрдЯрд▓рд┐рдВрдЧ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░рд╛рд░реВрдкреЛрдВ рдЬреИрд╕реЗ рд╡рд┐рднрд┐рдиреНрди рдЙрдкрд╣рд╛рд░ рдорд┐рд▓рддреЗ рд╣реИрдВред

рдПрдХ рдЕрдиреНрдп рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рдЙрдиреНрд╣реЛрдВрдиреЗ рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП django- рдкрд┐рд╕реНрдЯрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛; рд╡рд┐рд╖рдпрдЧрдд рд░реВрдк рд╕реЗ - django-tastypie рдЕрдЪреНрдЫреЗ рд╣реИрдВред

рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд рд╣реА рдЖрджрд┐рдо (рдФрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ) рдорджрдж рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рджреГрд╢реНрдп рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ:

  def _api_resources(api): resources = {} api_name = api.api_name for name in sorted(api._registry.keys()): resource = api._registry[name] resources[name] = { 'list_endpoint': api._build_reverse_url("api_dispatch_list", kwargs={ 'api_name': api_name, 'resource_name': name, }), 'schema': api._build_reverse_url("api_get_schema", kwargs={ 'api_name': api_name, 'resource_name': name, }), 'doc': resource.__doc__, 'resource': resource } return resources def browse(request, api): resources = _api_resources(api) return TemplateResponse(request, 'tasty_browser/index.html', { 'api': api, 'resources': resources }) 


рдЯреЗрдореНрдкрд▓реЗрдЯ:

  <h1>API {{ api.api_name }}</h1> <table class='tastypie-api'> <tr><th>Resource</th><th>url</th><th>Structure</th><th>Description</th></tr> {% for name, resource in resources.items %} <tr> <td>{{ name }}</td> <td> <a href='{{ resource.list_endpoint }}?format=json'> {{ resource.list_endpoint }}</a> </td> <td> <a href='{{ resource.schema }}?format=json'> {{ resource.schema }}</a> </td> <td> {{ resource.doc }} </td> </tr> {% endfor %} </table> 


рдЖрдк рдпрд╣рд╛рдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ: http://pangurman.ru/api-docs/

рднреБрдЧрддрд╛рди рдХреЛ django-robokassa (рдлрд┐рд░ рдЕрдзрд┐рдХ рд╡рд┐рдХрд▓реНрдк рдЬреЛрдбрд╝реЗ рдЬрд╛рдПрдВрдЧреЗ), рдЖрд░рдХреНрд╖рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрд╕рдПрдордПрд╕ рд╕реВрдЪрдирд╛рдУрдВ - imobis + рдЕрдЬрд╡рд╛рдЗрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЦрд░рд╛рдм рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред

рд╡рд┐рддреНрдд


рдЫрд╡рд┐

PanGurman рдореЗрдВ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкрд╛рд╕ рдПрдХ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЦрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдЦрд░реАрджрд╛рд░реА рдХреЗ рд▓рд┐рдП рднреБрдЧрддрд╛рди рдХрд░рдирд╛ рд╣реИред рдЖрдк рдЗрд╕реЗ Robokassa рдХреА рдорджрдж рд╕реЗ, рдорд┐рддреНрд░реЛрдВ рдХреЛ рдЖрдордВрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реБрдП, рдкреНрд░рдЪрд╛рд░рдХ рдХреЛрдб рджрд░реНрдЬ рдХрд░рдХреЗ рдлрд┐рд░ рд╕реЗ рднрд░ рд╕рдХрддреЗ рд╣реИрдВред рдлрд┐рд░, рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ, рдЕрдзрд┐рдХ рддрд░реАрдХреЛрдВ рдХреЛ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛ред

Fowler рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ рдХрдИ рд╡рд░реНрд╖реЛрдВ рд╕реЗ "рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЦрд╛рддреЗ" рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ: рд░рд╛рд╢рд┐ рдХрд╣реАрдВ рднреА рд╕рдВрдЧреНрд░рд╣реАрдд рдирд╣реАрдВ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕реЗ рдХрднреА-рдХрднреА рдХреИрд╢ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ), рд╣рдо рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЦрд╛рддреЗ рдореЗрдВ рд▓реЗрдирджреЗрди рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдЖрдкрдХреЛ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдЗрддрд┐рд╣рд╛рд╕ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ + рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдмрдЪрд╛рддрд╛ рд╣реИред

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

рдорд╛рдореВрд▓реА рдмрджрд▓рд╛рд╡реЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗ рд╕рдорд╛рди рдореЙрдбрд▓ рднрдЯрдХрддрд╛ рд╣реИ:

  class MoneyTransfer(models.Model): PURCHASE = 'purchase' ROBOKASSA = 'robokassa' INVITE_BONUS = 'invite-bonus' REFUND = 'refund' PROMOCODE = 'promocode' TRANSFER_TYPE_CHOICES = ( (u'  ', ( (PURCHASE, u' '), )), (u' ', ( (ROBOKASSA, u'  '), (INVITE_BONUS, u'   '), (PROMOCODE, u' '), (REFUND, u''), )), ) user = models.ForeignKey(User, verbose_name=u'') amount = models.DecimalField(u'', max_digits=10, decimal_places=2) created_at = models.DateTimeField(u'/ ', auto_now_add=True) comment = models.CharField(u'', max_length=255, blank=True, null=True) transfer_type = models.CharField(u'', max_length=20, null=True, blank=True, choices=TRANSFER_TYPE_CHOICES) content_type = models.ForeignKey(ContentType, null=True, blank=True) object_id = models.PositiveIntegerField(null=True, blank=True) reason = GenericForeignKey('content_type', 'object_id') 


рдпрд╣рд╛рдВ рдЖрдк рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдкрд░ рдзреНрдпрд╛рди рджреЗ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдзрд┐рдХ рд▓рд┐рдЦреЗрдВ, рд▓реЗрдХрд┐рди рдХреЛрдИ рдЬрд╛рджреВ рд╕реНрдерд┐рд░рд╛рдВрдХ рдирд╣реАрдВ рд╣реИрдВ рдФрд░ рдЖрдк рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдЖрдордВрддреНрд░рдг-рдмреЛрдирд╕ рдХреЗ рдмрдЬрд╛рдп Inv_bonus рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдирд╣реАрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ - MoneyTransfer.INVITE_BONUS рд╣рдореЗрд╢рд╛ рдЕрдХреЗрд▓рд╛ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рд▓рд┐рдЦреЗ рдЬрд╛рдиреЗ рдкрд░ (рддреБрд░рдВрдд-рдкреВрд░реНрдг рдкреНрд░рдХрдЯ рд╣реЛрддрд╛ рд╣реИ) рдПрдЯреНрд░реАрдмреНрдпреВрдЯ рдХреЗ рд╕рд╛рде рдЧрд┐рд░ рдЬрд╛рдПрдЧрд╛ред

рд╣рдордиреЗ рдПрдХ рдЯреЗрдмрд▓ рдмреБрдХ рдХреА, рд▓реЗрдХрд┐рди рд░реБрдХ рдЧрдП, рд▓реЗрдХрд┐рди рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ?


рд╕рд╣рд╛рдпрддрд╛ рдкреГрд╖реНрда рдкрд░ рдЬрд╛рдПрдВред рдЗрд╕ рдкреГрд╖реНрда рдкрд░, рдкрд╛рда рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛, рдЬрд╛рд╣рд┐рд░ рд╣реИ, рд╕рдВрдкрд╛рджрдХреЛрдВ рдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреА рднрд╛рдЧреАрджрд╛рд░реА рдХреЗ рдмрд┐рдирд╛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рджреЗрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

рдЫрд╡рд┐

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

  <div class="b-text"> {% flatblock "how-it-works" 600 %} </div> 


рдкреНрд░рд╡реЗрд╢ рдХреЗ рд▓рд┐рдП, рдкрд╛рда рдкрд░ рдордБрдбрд░рд╛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ
(рдпрд╣ рдЖрдкрдХреЗ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдлреНрд▓реИрдЯрдмреНрд▓реЙрдХ / рдлреНрд▓реИрдЯрдмреНрд▓реЙрдХ.html рд╕реЗрдЯ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ):

  {% load url from future %} {% load markup %} {% if user.is_staff %} <div class="b-flatblock-edit"> <a class="flatblock-edit-link markitup-flatblocks-edit-icon" title = " " href='{% url "edit_flatblock" flatblock.pk %}?next={{request.path}}'> </a> {{ flatblock.content|markdown:"video" }} </div> {% else %} {{ flatblock.content|markdown:"video" }} {% endif %} 


рдорд╛рд░реНрдХрдбрд╛рдЙрди рдореЗрдВ рдорд╛рд░реНрдХрдЕрдк рдмреНрд▓реЙрдХ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдПрдбрд┐рдЯ рдкреЗрдЬ рдкрд░ рд╣рдо django-markitup (рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдХреЗ рд╕рд╛рде) рд╕реЗ рд╡рд┐рдЬреЗрдЯ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ:

рдЫрд╡рд┐

рд╕рд╛рдЗрдЯ рдкрд░ рд╕рднреА рдЧреНрд░рдВрде рдЬрд┐рд╕рдореЗрдВ рдХреБрдЫ рдорд╛рд░реНрдХрдЕрдк рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИрдВ, django-markitup (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рддрд╕реНрд╡реАрд░реЛрдВ рдХреЗ рд╕рд╛рде рд░реЗрд╕реНрддрд░рд╛рдВ рдХреЗ рдкреНрд░реЗрд░рд┐рдд рд╡рд┐рд╡рд░рдг) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрдкрд╛рджрд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдорд╛рд░реНрдХрдбрд╛рдЙрди рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ HTML рдЯреИрдЧреНрд╕ рдХреЛ рди рдЫреБрдП, рддрд╛рдХрд┐ рдЬрд╝рд░реВрд░рдд рдкрдбрд╝рдиреЗ рдкрд░ рдХрд┐рд╕реА рднреА рдорд╛рд░реНрдХрдЕрдк рдХреЛ рдЯреЗрдХреНрд╕реНрдЯ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХреЗред
рдФрд░, рд╡рд┐рд╕реНрддрд╛рд░ рднреА рдЦрд░рд╛рдм рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ( рдЕрдЬрдЧрд░-рдорд╛рд░реНрдХрдбрд╛рдЙрди-рд╡реАрдбрд┐рдпреЛ ), рдЬреЛ рд╡реАрдбрд┐рдпреЛ рдореЗрдВ рдпреВрдЯреНрдпреВрдм рдпрд╛ рд╡реАрдорд┐рдпреЛ рдХреЗ рд▓рд┐рдВрдХ рдХреЛ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ - рдПрдХ рд╕реМрд╣рд╛рд░реНрджрдкреВрд░реНрдг рддрд░реАрдХреЗ рд╕реЗ, рдЖрдкрдХреЛ рд╕рдВрднрд╡рддрдГ oembed рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рд░реЗрд╕реНрддрд░рд╛рдВ рдкреИрдирд▓


рд░реЗрд╕реНрддрд░рд╛рдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреИрдирд▓ рд╣реИ рдЬрд┐рд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡реЗ рдЕрдм рдХрд╛рдо рдХреЗ рдШрдВрдЯреЗ (рдЬрдм рдЯреЗрдмрд▓ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ, рдЬрдм рдирд╣реАрдВ) рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкреИрдирд▓ рдПрдбрдорд┐рдирд╕рд╛рдЗрдЯ рдХреЗ рдПрдХ рдФрд░ рдЕрд▓рдЧ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред "рд░реЗрд╕реНрддрд░рд╛рдВ рдкреНрд░рдмрдВрдзрдХ" рдХреЗ рд░реВрдк рдореЗрдВ рдирд╛рдорд┐рдд рдХрд┐рдП рдЧрдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╡рд╣рд╛рдВ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВред рд╕реВрдХреНрд╖реНрдорддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЗрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдкрд╛рд╕ is_staff рдзреНрд╡рдЬ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдиреНрдпрдерд╛ рд╡реЗ рд╕рд╛рдорд╛рдиреНрдп рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдкреИрдирд▓ рдореЗрдВ рдЬрд╛ рд╕рдХреЗрдВрдЧреЗ, рдЬреЛ рд╡рд╛рдВрдЫрдиреАрдп рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдФрд░ рдЗрд╕рд▓рд┐рдП - рд╕рд╛рдорд╛рдиреНрдп рдХрд╕реНрдЯрдо рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдкреИрдирд▓ред

[рд╢реЗрдЦрд╝реА рдкрд░]
рдпрд╣ рдЕрдХреНрд╕рд░ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐, рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ, Dzhangovka рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдЕрдирдореНрдп рд╣реИ рдФрд░ рдЗрд╕реА рддрд░рд╣ред - рдореБрдЭреЗ рд╕рдордЭ рдирд╣реАрдВ рдЖрдпрд╛ рдХрд┐ рд▓реЛрдЧ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХреНрдпрд╛ рдорддрд▓рдм рд░рдЦрддреЗ рд╣реИрдВ :) рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдкреИрдирд▓ рд╕реАрдЖрд░рдпреВрдбреА, рд▓реЗрдЖрдЙрдЯ рдФрд░ рдбрд┐рдЬрд╝рд╛рдЗрди "рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░" рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдХреНрдпрд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рддреЛ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рд░реВрдврд╝рд┐рд╡рд╛рджреА рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ, рд╡реЗ рдЖрдорддреМрд░ рдкрд░ рдбреИрд╢рдмреЛрд░реНрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рд░реВрдкрд░реЗрдЦрд╛ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ - рдпрд╣ рд╕реАрдЖрд░рдпреВрдбреА рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рдВрдмрд╡рдд рдмрд╛рдд рд╣реИ, рдФрд░ dzhangovskoy рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдкреИрдирд▓ ( django-admin-tools , neusus) рдХреЗ рд▓рд┐рдП рдРрд╕реЗ рдврд╛рдВрдЪреЗ рд╣реИрдВред

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

рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдкреИрдирд▓ рдореЗрдВ, raw_id_fields рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдбрд░рд╛рд╡рдирд╛ рдирд╛рдо django-salmonella рдХреЗ рд╕рд╛рде рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдЙрдкрдпреЛрдЧреА рд╡реНрдпрд╡рд╣рд╛рд░ (FK рдФрд░ M2M рдХреЗ рд▓рд┐рдП) рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд░рд┐рдХреЙрд░реНрдб рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП "рд╕рдВрдХреНрд░рдорд┐рдд" рд╡рд┐рдЧреЗрдЯреНрд╕:

рдЫрд╡рд┐

рдЫрд╡рд┐

рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдЖрдИрдбреА рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕рдХрд╛ рдирд╛рдо рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ (ajax рджреНрд╡рд╛рд░рд╛ рдЕрджреНрдпрддрди); рдирд╛рдо рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рдЖрдк рддреБрд░рдВрдд рдСрдмреНрдЬреЗрдХреНрдЯ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкреЗрдЬ рдкрд░ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рднреА рд╣реИред

рдкрд░реАрдХреНрд╖рдг


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

 class ProfileF(factory.DjangoModelFactory): FACTORY_FOR = Profile city = factory.SubFactory(CityF) balance = 0 @classmethod def _prepare(cls, create, **kwargs): #  'balance=555' balance = kwargs.pop('balance') profile = super(ProfileF, cls)._prepare(create, **kwargs) if balance > 0: MoneyTransferF(user=profile.user, amount=balance) return profile class UserF(factory.DjangoModelFactory): FACTORY_FOR = User username = factory.Sequence(lambda n: "username%s" % n) first_name = factory.Sequence(lambda n: u" %s" % n) last_name = factory.Sequence(lambda n: u" %s" % n) email = factory.Sequence(lambda n: "email%s@example.com" % n) is_staff = False is_active = False is_superuser = False password = '123' profile = factory.RelatedFactory(ProfileF, 'user') @classmethod def _prepare(cls, create, **kwargs): kwargs['password'] = make_password(kwargs['password']) return super(UserF, cls)._prepare(create, **kwargs) 


рдЕрдм рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдЖрдк рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:

 user = UserF(profile__balance=100) 


рд╡рд╛рд░реНрдо-рдЕрдк рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВрдиреЗ рдлреИрдХреНрдЯреНрд░реА-рдмреЙрдп рдореЗрдВ 3-рдЕрдЬрдЧрд░ рдХреЗ рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде рдПрдХ рдкреБрд▓-рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ рдмрдирд╛рдИ, рд▓реЗрдХрд┐рди 3rd рдЕрдЬрдЧрд░ рдПрдХ рдЕрд▓рдЧ рдХрд╣рд╛рдиреА рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╖рдп рд╣реИ)

Django 1.4 рдореЗрдВ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдФрд░ рдЪрд╛рд▓ рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, PBKDF2 рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдкрд╛рд╕рд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред PBKDF2 рдореЗрдВ, рд╕реБрд░рдХреНрд╖рд╛ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдЗрд╕рдХреА рдХрдо рдЧрддрд┐ рд╣реИред рд▓реЗрдХрд┐рди рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрдо рдЧрддрд┐ рднреА рдХрдо рдЧрддрд┐ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреА рд╣реИ :) рдореБрдЦреНрдп рд╕рд╛рдЗрдЯ рдкрд░ рдпрд╣ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ (рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЬрд┐рддрдиреА рдмрд╛рд░ рд╡реЗ рд▓реЙрдЧ рдЗрди рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╡рд┐рд▓рдВрдм рдЫреЛрдЯрд╛ рд╣реИ) рджрд░реНрдЬ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЬрдм рдЖрдк рдХрд╛рд░рдЦрд╛рдиреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ -boy рдФрд░ рдХрдИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╣реИрд╢ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдкрд╛рд╕рд╡рд░реНрдб рдЕрд╕рд╛рдЗрди рдХрд░рдХреЗ рдмрдирд╛рдПрдВред

PanGurman рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрд╕ рд▓рд╛рдЗрди рдХреА рд╕реНрдерд╛рдкрдирд╛ рдореЗрдВ test_settings.py рдиреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ 2 рдЧреБрдирд╛ рддреЗрдЬ рдХрд░ рджрд┐рдпрд╛:

  PASSWORD_HASHERS = ['django.contrib.auth.hashers.MD5PasswordHasher'] 

Source: https://habr.com/ru/post/In142703/


All Articles