Django-grappelli: рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдкреГрд╖реНрдареЛрдВ рдкрд░ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рддрдм рддрдХ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреА рдЬрдм рддрдХ рдХреНрд░рд┐рдпрд╛рдПрдБ = ModelAdmins рдкрд░ рдХреЛрдИ рдирд╣реАрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 3 рдЕрдХреНрддреВре░ 2012  ┬╖  55рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: sehmaschine/django-grappelli

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

рдЬрдм рддрдХ рдХреНрд░рд┐рдпрд╛рдПрдБ = рдореЗрд░реЗ ModelAdmin рд╡рд░реНрдЧ рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдХреЛрдИ рдирд╣реАрдВ, рдЧреНрд░реЗрдкреЗрд▓реА рдЙрдард╛рддрд╛ рд╣реИ рдФрд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЕрдкрд╡рд╛рдж рдФрд░ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ (list_filter рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рд╛рде) рдЯреВрдЯ рдЬрд╛рддреА рд╣реИред рдбреНрд░реЙрдкрдбрд╛рдЙрди рдмрдЯрди рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЬрдм рдЖрдк рдЙрд╕ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдХреБрдЫ рднреА рдирд╣реАрдВ рдЧрд┐рд░рддрд╛ рд╣реИред

рддреНрд░реБрдЯрд┐ рд╣реИ "рдЕрдирдХреЙрдЯ рдЯрд╛рдЗрдк рдПрд░рд░: рдСрдмреНрдЬреЗрдХреНрдЯ [рдСрдмреНрдЬреЗрдХреНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ] рдореЗрдВ рдХреЛрдИ рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реИ 'рдХреНрд░рд┐рдпрд╛рдПрдВ'" рд▓рд╛рдЗрди рдкрд░ $("tr input.action-select").actions(); (рдЧреНрд░реЗрдкреЗрд▓реА рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдкрдВрдХреНрддрд┐ 66)ред

рдЧреНрд░реЗрдкреЗрд▓реА рдХреЛрдб рд╕реЗ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ

рд╕рд╛рде рд╣реА, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдВрдХ #206 рдХреЗ рд╕рдорд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдореИрдВ Django 1.4.1 рдФрд░ рдЧреНрд░реЗрдкреЗрд▓реА 2.4.2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ

рд╕рднреА 55 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдХреНрдпрд╛ рдЖрдк рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реИрдВ рдХрд┐ рдЖрдкрдиреЗ рдХреИрд╢ рд╕рд╛рдлрд╝ рдХрд░ рджрд┐рдпрд╛ рд╣реИ рдФрд░ рдЖрдк рд╕рд╣реА рдлрд╝рд╛рдЗрд▓реЗрдВ рд▓реЛрдб рдХрд░ рд░рд╣реЗ рд╣реИрдВ?
рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЗрд╕реЗ рдкреБрди: рдкреЗрд╢ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реВрдВ (рдФрд░ рдореБрдЭреЗ рдкреВрд░рд╛ рдпрдХреАрди рд╣реИ рдХрд┐ рдпрд╣ рдмрдЧ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ)ред

рдореИрдВрдиреЗ рдлрд┐рд░ рд╕реЗ рдЬрд╛рдБрдЪ рдХреА рд╣реИ рдФрд░ рдореИрдВ рдЗрд╕реЗ рдкреБрди: рдкреЗрд╢ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реВрдБ ... рдХреГрдкрдпрд╛ рдЯрд┐рдХрдЯ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓реЗрдВ рдпрджрд┐ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдмрдЧ рд╣реИред

рдЖрдк рд╕рд╣реА рдХрд╣ рд░рд╣реЗ рд╣реИрдВ--рдпрд╣ рдХреИрд╢ рдХреА рд╕рдорд╕реНрдпрд╛ рд░рд╣реА рд╣реЛрдЧреА, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрдм рдЪрд▓рд╛ рдЧрдпрд╛ рд╣реИред рдЕрдЬреАрдм рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдореИрдВ рдПрдХ рд╡рд┐рдХрд╛рд╕ рд╕рд░реНрд╡рд░ (рд╡рд░реНрдХрдЬрд╝реЗрдЧ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдХреЛрдИ рдХреИрд╢ рд╣реЗрдбрд░ рд╕реЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рдореБрдЭреЗ рдкрд╣рд▓реЗ рдХрднреА рднреА рдХреНрд░реЛрдо рдСрдЯреЛ-рдХреИрд╢рд┐рдВрдЧ рдореЗрдВ рдХреБрдЫ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реБрдИ рд╣реИред рдХреНрдпрд╛ рдЧреНрд░реЗрдкреЗрд▓реА рдХреА рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЬреЗрдирд░реЗрдЯ рдХреА рдЧрдИ рд╕рд╛рдордЧреНрд░реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЕрд▓рдЧ рд╣реИ? рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рдХреНрдпрд╛ рд╣рдо рджреВрд╕рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдиреЛрдЯрд┐рд╕ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ? рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рднреА рд╣реЛ рдЪреБрдХрд╛ рд╣реИ (рджреЗрдЦреЗрдВ рдЕрдВрдХ #206, рдЬрд┐рд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдКрдкрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред

рдореИрдВ рднреА рдЗрд╕ рдкрд░ рдареЛрдХрд░ рдЦрд╛рдИ рдФрд░ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХреИрд╢ рд╕рдорд╕реНрдпрд╛ рдХреА рддрд░рд╣ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдореИрдВ рдХреНрд░реЛрдо рдФрд░ рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдореЗрдВ рдХреИрд╢ рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реВрдВ рдФрд░ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рд╕рд╛рдЗрдЯ рдкрд░ рдлрд┐рд░ рд╕реЗ рдЬрд╛рддрд╛ рд╣реВрдВ, рддреЛ рддреНрд░реБрдЯрд┐ рдЧрд╛рдпрдм рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рд╕рд╛рде рд╣реА, Django рд╕рд░реНрд╡рд░ рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░рдирд╛ (рдореИрдВ gunicorn рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ) рдорджрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЕрднреА рддрдХ рдЧреНрд░реЗрдкреЗрд▓реА рдХрд╛ рдХреЛрдИ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рдмрд╕ рдЗрд╕реЗ рдкрд╛рдЗрдк (django-grappelli==2.4.2) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╕реЗрдЯрд┐рдВрдЧреНрд╕.py (django.contrib.admin рд╕реЗ рдкрд╣рд▓реЗ) рдореЗрдВ INSTALLED_APPS рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ ".actions ()" рдХреЗ рд▓рд┐рдП рдЕрд╕рдлрд▓ рдХреЙрд▓ grp.jQuery рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди .action() рдХреЗрд╡рд▓ django.jQuery рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред grappelli.min.js рдореЗрдВ рдЖрдк django.jQuery рдХреЛ grp.jQuery рдкрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рдкреНрд░рддреАрдд рд╣реЛрддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ рд╡реЗ рд╡рд╣реА рд╣реЛрдВ, рд▓реЗрдХрд┐рди рдХреНрдпреЛрдВрдХрд┐ рдЧреНрд░реЗрдкреЗрд▓реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ Django рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рдкрд╣рд▓реЗ рд▓реЛрдб рдХреА рдЬрд╛рддреА рд╣реИрдВ, рдЬреЛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреА рд╣реИред

рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ Django рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рд╕реВрдЪреА рдЕрд╡рд▓реЛрдХрди рдкреГрд╖реНрда рдХрд╛ HTML рдХреЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

<!-- jQuery, jQuery-UI -->
<script src="/static/grappelli/jquery/jquery-1.7.2.min.js" type="text/javascript"></script>
<script src="/static/grappelli/jquery/ui/js/jquery-ui-1.8.18.custom.min.js" type="text/javascript"></script>

<!-- Grappelli Minified -->
<script src="/static/grappelli/js/grappelli.min.js" type="text/javascript"></script>

<script type="text/javascript" src="/static/admin/js/core.js"></script>
<script type="text/javascript" src="/static/admin/js/admin/RelatedObjectLookups.js"></script>
<script type="text/javascript" src="/static/admin/js/jquery.js"></script>
<script type="text/javascript" src="/static/admin/js/jquery.init.js"></script>
<script type="text/javascript" src="/static/admin/js/actions.js"></script>

<script type="text/javascript" src="/admin/jsi18n/"></script>

<script type="text/javascript" charset="utf-8">
    (function($) {
        $(document).ready(function() {
            $("tr input.action-select").actions();
        });
    })(grp.jQuery);
</script>

рдпрд╣ рдореЗрд░реА рддрд░рдл рд╕реЗ рдПрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рддреНрд░реБрдЯрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рдХреИрд╢рд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛ рдХреА рддрд░рд╣ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИ ...

рдареАрдХ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдХрд╛рд░рдг рдорд┐рд▓ рдЧрдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рдПрдХ Django рдмрдЧ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ: рдЬрдм рдЖрдк рдЕрдкрдиреА рд╕реНрдерд┐рд░ рдлрд╛рдЗрд▓реЛрдВ рдХреА рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП Django рдХреЗ рд╕реНрдерд┐рд░ рдлрд╝рд╛рдЗрд▓ рд╡рд┐рдХрд╛рд╕ рджреГрд╢реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ Django рдЧреНрд░реЗрдкреЗрд▓реА рдХреЗ рдУрд╡рд░рд░рд╛рдЗрдб jQuery.js рдФрд░ jquery.init.js рдХреА рд╕реЗрд╡рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрдЬрд╛рдп Django рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рд╕реЗ рдореВрд▓ рдлрд╝рд╛рдЗрд▓реЗрдВ, рдЬреЛ рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХрд╛ рдХрд╛рд░рдг рдмрдирддреА рд╣реИрдВред :( рдЕрдм рдореИрдВ рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреМрд░рд╛рди рднреА рдЕрдкрдиреА рд╕реНрдерд┐рд░ рдлрд╛рдЗрд▓реЛрдВ рдХреЛ nginx рдХреЗ рд╕рд╛рде рдкрд░реЛрд╕ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдпрд╣ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдореИрдВ рд╕реНрдЯреЗрдЯрд┐рдХрдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдЕрднреА рднреА рдЗрд╕реЗ рдкреБрди: рдкреЗрд╢ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реВрдВред

@ рдлрд┐рд▓рд╡реЛ рдЖрдк рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ grappellis jquery.js рд▓реЛрдб рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдЕрдЧрд░ рдРрд╕рд╛ рд╣реИ, рддреЛ рдмрд╣реБрдд рд╕рд╛рд░реА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╣реИ рдЬреЛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреА рд╣реИ, рдареАрдХ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдд: рдкреВрд░реНрдг)? рдореВрд▓ рд░реВрдк рд╕реЗ, рдЕрдзрд┐рдХрд╛рдВрд╢ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдЕрдкреЗрдХреНрд╖рд╛ рдХреЗ рдЕрдиреБрд░реВрдк рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ ...

@sehmaschine рд╣рд╛рдВ, рдРрд╕рд╛ рд╣реА рдерд╛, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд░ рдирд┐рд░реНрднрд░ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдиреЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдореИрдВ рдЕрдЧрд▓реЗ рджрд┐рдиреЛрдВ рдореЗрдВ рдЕрдкрдиреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкрд░ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдХрд╛рд░рдг рдЦреЛрдЬрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реВрдВрдЧрд╛ рдФрд░ рдЖрдкрд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░реВрдВрдЧрд╛ред

рдпрд╣ рдмреЗрд╣рдж рдЕрдЬреАрдм рд╣реИред

рдореИрдВ рдЗрд╕реЗ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реВрдВ рдЬрдм рдореИрдВ "./manage.py рд░рдирд░рд╡рд░" рдпрд╛ "./manage.py run_gunicorn" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдЧрдирд┐рдХреЛрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ Django devserver рдЪрд▓рд╛рддрд╛ рд╣реВрдВ - рддреЛ Django рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдореЗрд░реА рдкреВрд░реА рд╕реНрдерд┐рд░ рдлрд╛рдЗрд▓ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддрд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ (рднрд▓реЗ рд╣реА рдореИрдВ рдЗрд╕реЗ рдЙрджреНрджреЗрд╢реНрдп рдкрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЧрд▓рдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ рдФрд░ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдЧреИрд░-рдореМрдЬреВрджрд╛ рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВред STATICFILES_FINDERS рдпрд╣ рдЕрднреА рднреА рд╕реНрдерд┐рд░ рдлрд╛рдЗрд▓реЛрдВ рдХреА рд╕реЗрд╡рд╛ рдХрд░реЗрдЧрд╛)ред

рдпрджрд┐ рдореИрдВ "gunicorn myapp. wsgi:application " рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЧрдирд┐рдХреЛрд░реНрди рдЪрд▓рд╛рддрд╛ рд╣реВрдВ, рддреЛ Django рдореЗрд░реА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХрд╛ рд╕рд╣реА рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рд╕реНрдерд┐рд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ urls.py рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп "urlpatterns + = staticfiles_urlpatterns ()" рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред рдлрд┐рд░ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЧреНрд░реЗрдкреЗрд▓реА рдХреА рдЬреЗрдПрд╕ рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдореВрд▓ Django рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдмрдЬрд╛рдп рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкрд░реЛрд╕рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдореИрдВ рдПрдХ рдиреНрдпреВрдирддрдо рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдпрджрд┐ рдореИрдВ рд╕рдлрд▓ рд╣реЛрддрд╛ рд╣реВрдВ, рддреЛ рдореИрдВ рдЗрд╕реЗ code.djangoproject.com рдкрд░ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд░рд┐рдкреЛрд░реНрдЯ рдХрд░реВрдВрдЧрд╛ред

рдЪреВрдВрдХрд┐ рд╣рдо рдПрдХ рдирдИ рд░рд┐рд▓реАрдЬ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ ...

  1. рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ STATICFILES_FINDERS рдХрд╛ рдЙрдкрдпреЛрдЧ рд░рдирд░рд╡рд░ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ (рдореИрдВ рдЗрд╕реЗ рдкреБрди: рдкреЗрд╢ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реВрдВ)ред
  2. рдлрд┐рд░ рднреА, рдореИрдВ django рдХреЛ рдЧреНрд░реЗрдкреЗрд▓реА рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реВрдВ (рдЬрдм рддрдХ рдХрд┐ рдореИрдВ INSTALLED_APPS рдХреЗ рд╕рд╛рде "рдЧреНрд░реЗрдкреЗрд▓реА" рд╕реЗ рдкрд╣рд▓реЗ "django.contrib.admin" рдЬреЛрдбрд╝ рд░рд╣рд╛ рд╣реВрдВ)ред

рдХреЛрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рд╕рд╣рд╛рдпрдХ рд╣реИ ... thxред

рдореБрдЭреЗ рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд░рд╣реА рд╣реИред рдореИрдВ Django 1.4.1 рдЪрд▓рд╛ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ contrib.admin рд╕реЗ рдкрд╣рд▓реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд┐рдП рдЧрдП рдРрдкреНрд╕ рдореЗрдВ рдЧреНрд░реЗрдкреЗрд▓реА рд╣реИред

<script type="text/javascript" charset="utf-8">
        (function($) {
            $(document).ready(function() {
                $("tr input.action-select").actions();
            });
        })(grp.jQuery);
</script>

рдЬрдм рдореИрдВ django.jQuery рдореЗрдВ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП change_list.html рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рд╕реВрдЪреА рдЖрдкрдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХреЗ рдЕрдиреБрд░реВрдк рдХрд╛рдо рдХрд░рддреА рд╣реИред рдПрдХ рдорд╣рд╛рди рдлрд┐рдХреНрд╕ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдХреБрдЫ рдЕрдВрддрд░реНрджреГрд╖реНрдЯрд┐ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

<script type="text/javascript" charset="utf-8">
        (function($) {
            $(document).ready(function() {
                $("tr input.action-select").actions();
            });
        })(django.jQuery);
</script>

рдореБрдЭреЗ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рднреА рдЙрдмрдВрдЯреВ 10.04 рдХреА рдПрдХ рддрд╛рдЬрд╛ рд╕реНрдерд╛рдкрдирд╛ рдкрд░ Django 1.4.2 рдФрд░ рдЧреНрд░реЗрдкреЗрд▓реА 2.4.3 рдЪрд▓ рд░рд╣реА рд╣реИ

$("tr input.action-select").actions is not a function

рдлрд╝рд╛рдпрд░рдмрдЧ рдХреЗ рд╕рд╛рде рджрд┐рдЦрд╛рдИ рдЬрд╛ рд░рд╣реА рддреНрд░реБрдЯрд┐ рд╣реИред

рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдореИрдВ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЗрдЯрдо рдХрд╛ рдЪрдпрди рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред

рдореИрдВрдиреЗ рд╕реАрдзреЗ рдбреЛрдореЗрди рдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ рдФрд░ рд░рдирд░рд╡рд░ рдХреЗ рд╕рд╛рде рднреАред

рдкрд╣рд▓реЗ рддреЛ рдореБрдЭреЗ рджреЛрдиреЛрдВ рдХреЗ рд╕рд╛рде рддреНрд░реБрдЯрд┐ рдорд┐рд▓ рд░рд╣реА рдереА рд▓реЗрдХрд┐рди рдмрджрд▓ рд░рд╣рд╛ рдерд╛

STATIC_URL = 'http://somedomain.com/static/'

рд╕рд░рд▓рддрд╛ рд╕реЗ

STATIC_URL = '/static/'

рд░рдирд░рд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд┐рдпрд╛ рд▓реЗрдХрд┐рди рдбреЛрдореЗрди рдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рд╕рдорд╕реНрдпрд╛ рдЕрднреА рднреА рдореМрдЬреВрдж рд╣реИред

рдореИрдВрдиреЗ рджреЛрдиреЛрдВ рдХреЗ рдПрдЪрдЯреАрдПрдордПрд▓ рдЖрдЙрдЯрдкреБрдЯ рдХреЛрдб рдХреА рддреБрд▓рдирд╛ рдХреА рд╣реИ рдФрд░ рд╡реЗ рд╕рдорд╛рди рд╣реИрдВред

рдпрд╣ рд╕рдм рдореЗрд░реЗ рджреЗрд╡ рд╕рд░реНрд╡рд░ рдкрд░ рддреНрд░реБрдЯрд┐рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдореИрдВ рдПрдХ рд╢рд╛рдирджрд╛рд░ рдЙрддреНрдкрд╛рдж рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдбрд╝рд╛ рдзрдиреНрдпрд╡рд╛рдж рдХрд╣рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдЗрд╕рдХреЗ рд▓рд┐рдП рдлрд┐рдВрдЧрд░ рдХреНрд░реЙрд╕ рдлрд┐рдХреНрд╕ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдХреЛрдИ рдФрд░ рдЬрд╛рдирдХрд╛рд░реА рдЬреЛ рдореИрдВ рдЖрдкрдХреЛ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХреГрдкрдпрд╛ рдмрд╕ рдкреВрдЫреЗрдВред

рдХреНрдпрд╛ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдХреЛрдИ рдкреНрд░рдЧрддрд┐ рд╣реБрдИ рд╣реИ?

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

@maffacow рдЬрдм рд╕реЗ рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдкреБрди: рдкреЗрд╢ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реВрдВ, рдореБрдЭреЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЕрдм рддрдХ, рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ "рдлрд┐рдХреНрд╕" рдХреНрдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ ...

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

рдареАрдХ рд╣реИ ... рдЖрдк рдбреАрдмрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рдорд╕реНрдпрд╛ рдвреВрдВрдв рд╕рдХрддреЗ рд╣реИрдВ (рдпрджрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореМрдЬреВрдж рд╣реИ) рдФрд░ рдкреБрд▓-рдЕрдиреБрд░реЛрдз рд╕рдмрдорд┐рдЯ рдХрд░реЗрдВред рдпрд╣ рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рд╕реАрдзрд╛ рддрд░реАрдХрд╛ рд╣реИред

рдореЗрд░реЗ рдкрд╛рд╕ рд╕рдорд╛рди/рд╕рдорд╛рди рд╕рдорд╕реНрдпрд╛ рд╣реИ, рд╕рд╛рдЗрдЯ devserver рдкрд░ рдареАрдХ рдХрд╛рдо рдХрд░рддреА рд╣реИ рд▓реЗрдХрд┐рди рдЬреЗрдПрд╕ рд▓реЛрдбрд┐рдВрдЧ рдЙрддреНрдкрд╛рджрди рд╕рд░реНрд╡рд░ (nginix) рдкрд░ рдареАрдХ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣реА рд╣реИ

Django рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ jQuery libs рдХреЛ рдЧреНрд░реЗрдкреЗрд▓реА рдУрд╡рд░рд░рд╛рдЗрдб рдХреЗ рдмрдЬрд╛рдп рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ

рдЧреНрд░реЗрдкреЗрд▓реА рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рдПрдХрдорд╛рддреНрд░ рд╕реНрдерд╛рди рдореБрдЦреНрдп рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ/рдкреГрд╖реНрда рдкрд░ рд╣реИ, рдпрд╛рдиреА рдХреНрд▓рд┐рдХ() рдИрд╡реЗрдВрдЯ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╡рд┐рдХрд▓реНрдк рдбреНрд░реЙрдкрдбрд╛рдЙрди рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдЖрдк рд╢реАрд░реНрд╖ рдореЗрдиреВ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ .. рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рддрднреА рдЬрдм рдЖрдк рдореБрдЦреНрдп рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдбреИрд╢рдмреЛрд░реНрдб рдкрд░ рд╣реЛрдВ . (рдХреНрдпреЛрдВрдХрд┐ django рдореБрдЦреНрдп рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдбреИрд╢рдмреЛрд░реНрдб рдкрд░ рдЕрдкрдиреЗ jQuery рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рд▓реЛрдб рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ)

Django 1.4.2 рдЧреНрд░реЗрдкреЗрд▓реА 2.4.3 рдХреЗ рд╕рд╛рде, рдХреЛрдИ рдХреИрд╢рд┐рдВрдЧ рд╕рдХреНрд╖рдо рдирд╣реАрдВ, рд╕рдм рдХреБрдЫ рдареАрдХ рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ .. рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рдорд╛рди рдЙрддреНрдкрд╛рджрди рд╕реЗрдЯрдЕрдк рдкрд░ рдЧреНрд░реЗрдкреЗрд▓реА рдХреЗ рд╕рд╛рде рдХрдИ Django 1.3 рд╕рд╛рдЗрдЯреЗрдВ рд╣реИрдВред

рдареАрдХ рд╣реИ, рдореБрдЭреЗ рдЖрдЦрд┐рд░рдХрд╛рд░ рдпрд╣ рдореЗрд░реЗ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред

рд╕рд╣рдорд╛рд╕реНрдЪрд┐рди, рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╕рд╣реА рд╣реИ, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдмрдЧ рдирд╣реАрдВ рдерд╛ рдмрд▓реНрдХрд┐ рдореЗрд░реА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рдФрд░ рдЕрдзрд┐рдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдерд╛ред

рдореИрдВ рдЕрдкрдиреА рд╕рд╛рдЗрдЯ-рдЙрдкрд▓рдмреНрдз рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЕрдкрд╛рдЪреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбрд┐рд╕реНрдЯ-рдкреИрдХреЗрдЬ рд╕реЗ рд╕реНрдерд┐рд░ рдлрд╛рдЗрд▓реЗрдВ рд▓реЛрдб рдХрд░ рд░рд╣рд╛ рдерд╛ред

<br i="8"/> Alias /static/grappelli /usr/local/lib/python2.6/dist-packages/grappelli/static/grappelli<br i="9"/> Alias /static /usr/local/lib/python2.6/dist-packages/Django-1.4-py2.6.egg/django/contrib/admin/static<br i="10"/>

рдпрд╣ рдмреЗрд╡рдХреВрдлреА рдереА рдореБрдЭреЗ рдкрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдореБрдЭреЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬрдм рдкрд╣рд▓реА рдмрд╛рд░ Django рдХреЗ рд╕рд╛рде рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛

рдореБрдЭреЗ рдмрд╕ рдЗрддрдирд╛ рд╣реА рдЪрд╛рд╣рд┐рдП рдерд╛
<br i="15"/> Alias /static /srv/www/mywebsite.com/public_html/static<br i="16"/>

рдФрд░ рдореЗрд░реА settings.py . рдореЗрдВ
<br i="20"/> STATIC_ROOT = '/srv/www/mywebsite.com/public_html/static/'<br i="21"/> STATIC_URL = '/static/'<br i="22"/>

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

рдареАрдХ рд╣реИ, рдореИрдВрдиреЗ рдЕрдкрдиреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рднреА рдкрддрд╛ рд▓рдЧрд╛ рд▓рд┐рдпрд╛, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдХреИрд╢рд┐рдВрдЧ/рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рддреНрд░реБрдЯрд┐ рдереАред

HTTP рдХреЗ рд▓рд┐рдП рдХреИрд╢рд┐рдВрдЧ рдЕрдХреНрд╖рдо рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рд▓реЗрдХрд┐рди SSL /static рдЙрдкрдирд╛рдо рдХреЗ рд▓рд┐рдП рд╕рдХреНрд╖рдо рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдореЗрд░реЗ рдкрд╛рд╕ рдорд╛рдлрд╝рд╛рдХреЛ рдХреА рддрд░рд╣ рдПрдХ рд╕рдорд╛рди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдерд╛ред

рдХрд▓реЗрдХреНрдЯрд┐рд╡ рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдФрд░ рд╕рд░реНрд╡рд░-рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдирд╛рдо рдХреЛ рд╣рдЯрд╛рдиреЗ рд╕реЗ рдореЗрд░реЗ рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛ рдареАрдХ рд╣реЛ рдЧрдИред

рдореБрдЭреЗ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рдорд┐рд▓реА: рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреИрд╢ рдХреЛ рд╕рд╛рдлрд╝ рдХрд░рдиреЗ рд╕реЗ рдЗрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛

Google рдРрдк рдЗрдВрдЬрди рдкрд░ рддреИрдирд╛рддреА рдХрд░рддреЗ рд╕рдордп рдореБрдЭреЗ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИред рдореЗрд░реА рд╕реНрдерд╛рдиреАрдп рдорд╢реАрди рдкрд░ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЬреЗрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП рдкреГрд╖реНрда рдХреЗ рд╕реНрд░реЛрдд рд╕реЗ рдореИрдВ рдЬреАрдПрдИ рдкрд░ рдЪрд▓рддреЗ рд╕рдордп рд╡рд┐рднрд┐рдиреНрди рдЬреЗрдПрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдВ рджреЗрдЦрддрд╛ рд╣реВрдВ:

/static/grapelli . рд╕реЗ jquery-1.7.2.min.js
/static/grappelli . рд╕реЗ jquery-ui-1.8.18.custom.min.js

/static/grappelli . рд╕реЗ grappelli.min.js

core.js рд╕реЗ /static/admin
/static/admin . рд╕реЗ рд╕рдВрдмрдВрдзрд┐рддрдСрдмреНрдЬреЗрдХреНрдЯ рд▓реБрдХрдЕрдк.рдЬреЗрдПрд╕
/static/admin . рд╕реЗ jquery.js
/static/admin . рд╕реЗ jquery.init.js
/static/admin . рд╕реЗ action.js

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

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдЕрднреА рддрдХ рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИред рд╡реИрд╕реЗ, рдПрдХ рдмреЗрд╣рддрд░реАрди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж...

рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣ рдореБрджреНрджрд╛ рдерд╛, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдХрд┐ AppDirectoriesFinder рдкрд╣рд▓реЗ STATICFILES_FINDERS рдореЗрдВ рд╕реЗ рд╣реИ, рдЬреИрд╕реЗ:

STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
    'django.contrib.staticfiles.finders.FileSystemFinder',
 )

@ulmus рдпрд╣ рдПрдХ рдЕрдЪреНрдЫреА рдмрд╛рдд рд╣реИ - рд╣рдо рдЙрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рдбреЙрдХреНрд╕ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВрдЧреЗред

рдореЗрд░реЗ рдкрд╛рд╕ рдЖрдЬ рднреА рдпрд╣ рдореБрджреНрджрд╛ рдерд╛ред рдореИрдВрдиреЗ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд┐рдпрд╛ рдХрд┐ AppDirectoriesFinder рдкрд╣рд▓реЗ STATICFILES_FINDERS рдореЗрдВ рдерд╛ рдФрд░ рд╕рд╛рде рд╣реА рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдореЗрд░реЗ STATIC_ROOT , STATICFILES_DIRS , рдФрд░ STATIC_URL рд╕рднреА рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕реЗрдЯ рдХрд┐рдП рдЧрдП рдереЗред

рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдореЗрд░реА local.py рд╕реЗрдЯрд┐рдВрдЧ рдлрд╝рд╛рдЗрд▓ рд╕реЗ $# GRAPPELLI_INDEX_DASHBOARD 5$#$ рдФрд░ рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рдШреЛрд╖рдгрд╛рдУрдВ рдХреЗ рдКрдкрд░ рдореЗрд░реА base.py рд╕реЗрдЯрд┐рдВрдЧ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╣реЛ рд░рд╣рд╛ рд╣реИред

@idboehman рд╕рдВрдХреЗрдд рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдкреВрд░рд╛ рдпрдХреАрди рд╣реИ рдХрд┐ GRAPPELLI_INDEX_DASHBOARD рдХрд┐рд╕реА рднреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИред рдореЗрд░рд╛ рдЕрдиреБрдорд╛рди рд╣реИ рдХрд┐ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдХреИрд╢рд┐рдВрдЧ рдХреЗ рдХрд╛рд░рдг рд╣реЛрддреА рд╣реИ (рдмреНрд░рд╛рдЙрдЬрд╝рд░-рдХреИрд╢ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдкреБрд░рд╛рдиреА .pyc-files рд╣реЛ рд╕рдХрддрд╛ рд╣реИ)ред

рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣ рдореБрджреНрджрд╛ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рд╣реИред STATICFILES_FINDERS рдлрд┐рдХреНрд╕ рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛ред

рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдореИрдВрдиреЗ рдпрд╣ рдХрд┐рдпрд╛ рдерд╛ рд╡рд╣ рдореЗрд░реЗ рд╕реНрдЯреИрдЯрд┐рдХрдлрд╛рдЗрд▓ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЧреНрд░реЗрдкреЗрд▓реА/рд╕реНрдЯреИрдЯрд┐рдХ/рдПрдбрдорд┐рди (рдЬрд┐рд╕рдореЗрдВ рдЬреЗрдПрд╕ рдлрд╛рдЗрд▓реЗрдВ рд╣реИрдВ) рдХреЗ рд▓рд┐рдП рд╕рд┐рдорд▓рд┐рдВрдХ рдмрдирд╛рдирд╛ рдерд╛ред STATICFILES_FINDERS рдиреЗ рдорджрдж рдирд╣реАрдВ рдХреАред

рдЗрд╕рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рднреА рдЗрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛, рдЬрд╝рдЬрд╝рд╛рд░реНрдЯред

рдмрд╕ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдорд╕реНрдпрд╛ рдпрд╣ рдкреНрд░рддреАрдд рд╣реЛрддреА рд╣реИ рдХрд┐ рдЗрдВрд╕реНрдЯреЙрд▓ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реБрдП, django рдХреА рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд jQuery рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЧреНрд░реЗрдкреЗрд▓реА jquery-1.7.2 рдХреЗ рдмрд╛рдж рд▓реЛрдб рд╣реЛ рд░рд╣реА рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ рд▓рд┐рдВрдХ рдмрдирд╛рдирд╛ jQuery рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдкреНрд░рднрд╛рд╡реА рдврдВрдЧ рд╕реЗ рджреЛ рдмрд╛рд░ рд▓реЛрдб рдХрд░рдиреЗ рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рдпрд╣ рд╡рд╣реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИред

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

@zzart рдЕрдЧрд░ рдЖрдкрдХреЛ рдПрдХ рд╕рд┐рдореНрд▓рд┐рдВрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддреЛ рдЖрдкрдХреЗ рд╕реНрдЯреИрдЯрд┐рдХрдлрд╛рдЗрд▓реНрд╕ рд╕реЗрдЯрдЕрдк рдореЗрдВ рдХреБрдЫ рдЧрдбрд╝рдмрдбрд╝ рд╣реИ ... рдХрд▓реЗрдХреНрдЯрд┐рдХ рдХрд░рддреЗ рд╕рдордп рд╕рднреА рд╕реНрдЯреИрдЯрд┐рдХрдлрд╛рдЗрд▓реНрд╕ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдорд┐рд▓ рдЬрд╛рдиреЗ рдЪрд╛рд╣рд┐рдПред

@tufelkinder djangos рдмрд┐рд▓реНрдЯ-рдЗрди jQuery рдЧреНрд░реЗрдкреЗрд▓реА рджреНрд╡рд╛рд░рд╛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (jquery.min.js рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рд╛рдордЧреНрд░реА рдирд╣реАрдВ рд╣реИ)ред

рджреЛ рдорд╣реАрдиреЛрдВ рдореЗрдВ, рдореБрдЭреЗ рдпрд╣ рд╕рдорд╕реНрдпрд╛ 3 рдмрд╛рд░ рд╣реБрдИ рд╣реИ, рдФрд░ рд╣рд░ рдмрд╛рд░ рдореИрдВрдиреЗ рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рддрд░реАрдХреЗ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ред

рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк AppDirectoriesFinder рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ @ulmus рдЯрд┐рдкреНрдкрдгреА рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЕрдкрдиреЗ рд╕реНрдерд┐рд░ рдлрд╝реЛрд▓реНрдбрд░ рдХреЗ рдЕрдВрджрд░, рдЖрдк рдЕрдкрдиреЗ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ> рдЬреЗрдПрд╕ рдлрд╝реЛрд▓реНрдбрд░ рдХреЛ рдЕрдкрдиреЗ рдЧреНрд░реЗрдкреЗрд▓реА> рд╕реНрдерд┐рд░> рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ> рдЬреЗрдПрд╕ рдлрд╝реЛрд▓реНрдбрд░ рд╕реЗ рдмрджрд▓ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЬрд╛рддреА рд╣реИ!

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

рдореИрдВ рд╕рд┐рдореНрд▓рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕реЗ nginx рд╕рд╛рдЗрдЯ рдХреЙрдиреНрдлрд┐рдбреЗрдВрд╕ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рд╣реИ:

location = /static/admin/js/jquery.js {
    alias /dev/null;
}

@grafa рд▓реЗрдХрд┐рди рдлрд╝рд╛рдЗрд▓ /static/admin/js/jquery.js рдЦрд╛рд▓реА рд╣реИ, рджреЗрдЦреЗрдВ
https://github.com/sehmaschine/django-grappelli/blob/master/grappelli/static/admin/js/jquery.js

рдПрдХ рдФрд░ рд╡рд┐рдЪрд╛рд░ - рдХреНрдпрд╛ рдЖрдкрдиреЗ рдореВрд▓ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ-рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рддреЗ рд╣реБрдП рдХрд▓реЗрдХреНрдЯрд┐рдХ рдЪрд▓рд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛?
рдЕрдЬрдЧрд░ рдкреНрд░рдмрдВрдзрди.py рд╕рдВрдЧреНрд░рд╣рдгреАрдп --рдЕрдирджреЗрдЦрд╛ django.contrib.admin

рддреЛ рдореБрдЭреЗ рдпрд╣ рд╡рд╣реА рд╕рдорд╕реНрдпрд╛ рдереА ... рдореИрдВрдиреЗ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рд╕рдВрднрд╛рд▓рд╛ рдерд╛ рдХрд┐ рдХрд┐рд╕реА рдмрд┐рдВрджреБ рдкрд░ 1.3 Django (рд╡рд░реНрддрдорд╛рди рдореЗрдВ 1.4) рд╕реЗ рдкрд╣рд▓реЗ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдореИрдВ рдкреБрд░рд╛рдиреЗ 'рд╕реНрдЯреИрдЯрд┐рдХрдлрд╛рдЗрд▓реНрд╕' рдРрдк рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░ рд░рд╣рд╛ рдерд╛, рди рдХрд┐ 'django.contrib.staticfiles' рдХрд╛ рдФрд░ рдХрд▓реЗрдХреНрдЯрд┐рдХ рдХреЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рдирд╣реАрдВ рдорд┐рд▓ рд░рд╣рд╛ рдерд╛ред django рдХреЗ рд╕реНрдереИрддрд┐рдХ рдкрд░ рдорд╛рдЗрдЧреНрд░реЗрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╕рд╛рдореВрд╣рд┐рдХ рдХрд╛рдо рдХрд┐рдпрд╛ рдФрд░ рдХреЛрдИ рдФрд░ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ!

@sehmaschine рдореЗрд░рд╛ рд╕рдорд╛рдзрд╛рди 100% рдирд╣реАрдВ рдерд╛ред рдореИрдВрдиреЗ рдХрд▓реЗрдХреНрдЯрд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рдЕрдм рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣рд▓ рд╣реЛ рдЧрдИ рдереА ::

STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
'django.contrib.staticfiles.finders.FileSystemFinder',
)

рд╣рд╛рдп рдореБрдЭреЗ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ .. рдореИрдВрдиреЗ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдХреБрдВрдЬреА рдкреИрдб рдХреЗ рд▓рд┐рдП рдПрдХ рдЬреЗрдПрд╕ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдИ рд╣реИ рдФрд░ рдореИрдВ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рд╕реЗ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реВрдВ, рдпрд╣ рдХреЙрд▓ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред рдореБрдЭреЗ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ "[рдСрдмреНрдЬреЗрдХреНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ] рдореЗрдВ рдХреЛрдИ рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реИред рдХрд┐рд╕реА рднреА рдорджрдж рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХреА рдЬрд╛рдПрдЧреАред рдЕрдЧреНрд░рд┐рдо рдзрдиреНрдпрд╡рд╛рдж

рдорд┐рд▓ рдЧрдпрд╛! рдЕрдкрдиреА рд╕реНрдерд┐рд░ рд░реВрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдкреБрд░рд╛рдиреА рдЧреНрд░реЗрдкреЗрд▓реА рдФрд░ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдирд┐рдХрд╛рд▓рдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдмрджрд▓рдиреЗ рдХреЗ рдмрд╛рдж рдлрд┐рд░ рд╕реЗ рдПрдХ manage.py collectstatic рдХрд░реЗрдВред

STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
'django.contrib.staticfiles.finders.FileSystemFinder',
}
рдЕрдм рдЙрд╕рдиреЗ рдЙрд╕ рддреНрд░реБрдЯрд┐ рдХреЗ рдмрд┐рдирд╛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ред

рдореБрдЭреЗ Gunicorn рдФрд░ ngnix рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЗ рд╕рд╛рде рднреА рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рдереАред рдореЗрд░реЗ рдкрд╛рд╕ AppDirectoriesFinder рд╕реЗ рдкрд╣рд▓реЗ FileSystemFinder рдореЗрдВ STATICFILES_FINDERS рдерд╛ рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдХреНрдпрд╛ рдХрд╛рдо рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдЬрдм рдЧреНрд░реЗрдкреЗрд▓реА рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ/рдЬреЗрдПрд╕/рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ, рддреЛ рд╡рд╣ рдЗрд╕реЗ рдЧреНрд░реЗрдкреЗрд▓реА рдХреЗ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░ рд░рд╣рд╛ рд╣реИ, рди рдХрд┐ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдРрдкреНрд╕ред

рдпрд╣ рдореЗрд░рд╛ ngnix config рдЕрдм рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:

   location /static/admin/js/ {
       root /usr/local/lib/python2.7/dist-packages/grappelli/;
 }
location /static/admin/media/ {
       root /usr/local/lib/python2.7/dist-packages/django/contrib/admin/static/admin/;
 }

 location /static/grappelli/ {
      root /usr/local/lib/python2.7/dist-packages/grappelli/;
    }

 location /static/ {
    # if asset versioning is used
    if ($query_string) {
        expires max;
      }
 }

@squarepegsys рдзрдиреНрдпрд╡рд╛рдж, рдЖрдкрдХреЗ рд╕рдорд╛рдзрд╛рди рдиреЗ рднреА рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рдХрд░ рджреА ...

Nginx рдХреЗ рд╕рд╛рде, рдЖрдкрдХреЗ рдкрд╛рд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ location /static/ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдЖрдкрдХреЗ рд╕реНрдерд┐рд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╝реЛрд▓реНрдбрд░ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ ./manage.py collectstatic DTRT рджреЗрдВ, settings.py рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕рдВрдЧреНрд░рд╣ рдЖрджреЗрд╢ рдХрд╛ рд╕рдореНрдорд╛рди рдХрд░рддреЗ рд╣реБрдПред рдЗрд╕ рддрд░рд╣, рдЖрдкрдХрд╛ nginx рдФрд░ рд░рдирд░рд╡рд░ рд╡рд╛рддрд╛рд╡рд░рдг рдмрд╣реБрдд рдЕрдзрд┐рдХ рддреБрд▓рдиреАрдп рд╣реЛрдЧрд╛ред

рд╡рд╣реА рд╕рдорд╕реНрдпрд╛ рдЬреЛ 2+ рд╡рд░реНрд╖реЛрдВ рд╕реЗ рд░рд┐рдкреЛрд░реНрдЯ рдХреА рдЧрдИ рд╣реИред рд╕рднреА рдЙрдЪрд┐рдд рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ред рдХреЛрдИ рднрд╛рдЧреНрдп рдирд╣реАрдВред

@sdillinger рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, рдЗрд╕реЗ 2+ рд╡рд░реНрд╖реЛрдВ рддрдХ рдкреБрди: рдкреЗрд╢ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рдкреВрд░рд╛ рдпрдХреАрди рд╣реИ рдХрд┐ рдпрд╣ рдЧреНрд░реЗрдкреЗрд▓реА рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИ рдмрд▓реНрдХрд┐ рдЖрдкрдХреЗ рд╕рд░реНрд╡рд░/рдбреАрдЬреЗрдВрдЧреЛ рд╕реЗрдЯрдЕрдк рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред

рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рд╣реА рд▓рдХреНрд╖рдг рдХреЗ рдХрдИ рдореВрд▓ рдХрд╛рд░рдг рд╣реЛрддреЗ рд╣реИрдВред

рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, 'рд░рдирд╕рд░реНрд╡рд░', рд╕рдорд╛рдзрд╛рди STATICFILES_FINDERS рдХреЛ рдЙрд▓реНрдЯрд╛ рдХрд░рдирд╛ рдерд╛ рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ... рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ STATICFILES_FINDERS рдиреЗ рдХреЗрд╡рд▓ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд┐рдпрд╛ рдФрд░, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдПрдХ рд▓рд╛рд▓ рд╣реЗрд░рд┐рдВрдЧ рдереАред

рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рдХреНрдпрд╛ рд╣рд▓ рд╣реЛ рдЧрдпрд╛ рдерд╛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдбрд┐рдмрдЧ_рдЯреВрд▓рдмрд╛рд░ рд╕реЗ рдкрд╣рд▓реЗ рдЧреНрд░реЗрдкреЗрд▓реА рд▓реЛрдб рд╣реЛ:

INSTALLED_APPS = (
...
'рдЧреНрд░реЗрдкреЗрд▓реА',
'рдбреАрдмрдЧ_рдЯреВрд▓рдмрд╛рд░',
...
)

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

sehmaschine рдиреЗ 11 рдЕрдЧрд╕реНрдд рдХреЛ рдЯрд┐рдкреНрдкрдгреА рдХреА
@sdillinger рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, рдЗрд╕реЗ 2+ рд╡рд░реНрд╖реЛрдВ рддрдХ рдкреБрди: рдкреЗрд╢ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рдкреВрд░рд╛ рдпрдХреАрди рд╣реИ рдХрд┐ рдпрд╣ рдЧреНрд░реЗрдкреЗрд▓реА рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИ рдмрд▓реНрдХрд┐ рдЖрдкрдХреЗ рд╕рд░реНрд╡рд░/рдбреАрдЬреЗрдВрдЧреЛ рд╕реЗрдЯрдЕрдк рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред

@sehmaschine : рдореИрдВ рдЖрдкрдХреЗ рд╕рд╛рде 100% рд╣реВрдВ - рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрдо рд╕реЗ рдХрдо, рдЗрд╕рдХрд╛ рдЧреНрд░реЗрдкреЗрд▓реА рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рдерд╛ред рддреНрд░реБрдЯрд┐ рдХреЛ рдкреБрди: рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ (рдФрд░ рдареАрдХ рдХрд░рдиреЗ) рдХреЗ рд▓рд┐рдП - рд╢рд╛рдпрдж рдореИрдВ рдЗрд╕рдореЗрдВ рдЖрдкрдХреА рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ ...


рдЯреАрдПрд▓; рдбреАрдЖрд░

рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдПрдХ рд╕рд░рд▓, рдХрд╛рд░реНрдпрд╢реАрд▓ рд╕рдорд╛рдзрд╛рдиред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рджреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рдВрджрд░реНрдн:

http://django-grappelli.readthedocs.org/en/latest/quickstart.html#setup :

settings.py рдЦреЛрд▓реЗрдВ рдФрд░ рдЕрдкрдиреЗ $# grappelli INSTALLED_APPS ( django.contrib.admin рд╕реЗ рдкрд╣рд▓реЗ) рдореЗрдВ grappelli рдЬреЛрдбрд╝реЗрдВ:

INSTALLED_APPS = (
    'grappelli',
    'django.contrib.admin',
)

https://docs.djangoproject.com/hi/dev/ref/contrib/staticfiles/#django -admin-option---clear:

--clear

рдореВрд▓ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдХреЙрдкреА рдпрд╛ рд▓рд┐рдВрдХ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдореМрдЬреВрджрд╛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рд╛рдлрд╝ рдХрд░реЗрдВред

рдПрдХ рдЪреЗрддрд╛рд╡рдиреА:

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

рдЕрдм рдХрджрдо:

  1. рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ 'grappelli' рд╕реЗ рдкрд╣рд▓реЗ 'django.contrib.admin' рдореЗрдВ INSTALLED_APPS рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рджрд┐рдП рдЧрдП рд╕рдВрджрд░реНрдн рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ
  2. python manage.py collectstatic --noinput --clear . рдЪрд▓рд╛рдПрдБ
  3. рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реЗ рдкрд░реАрдХреНрд╖рдг, рдЙрд╕ рдкрд░ рдлрд╝рд┐рд▓реНрдЯрд░ рдмрдЯрди рдХреЗ рд╕рд╛рде рдкреГрд╖реНрда рдХреЗ рдкреВрд░реНрдг рдкреБрдирдГ рд▓реЛрдб рдХреЗ рд╕рд╛рде -- рддреНрд░реБрдЯрд┐ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП

рдмреБрдирд┐рдпрд╛рджреА рд╕рд┐рдВрд╣рд╛рд╡рд▓реЛрдХрди
рдкрд╣рдЪрд╛рди

рдиреАрдЪреЗ рджрд┐рдЦрд╛рдП рдЧрдП рдЪрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде, рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реЗрдЯрдЕрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рдЧрд╛рддрд╛рд░ 100% рддреНрд░реБрдЯрд┐ рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдФрд░ рдареАрдХ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реВрдВ:

  1. Django 1.8
  2. DEBUG = False
  3. Nginx + Gunicorn рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗред рдпреВрдирд┐рдХреНрд╕ рд╕реЙрдХреЗрдЯ

рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЬрдм рддрдХ рд╕реНрдерд┐рд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ STATIC_ROOT рдкрд░ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдирд┐рдореНрди рдЪрд░рдгреЛрдВ рдХреЛ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рддреНрд░реБрдЯрд┐ рдХрд╛ рдкреБрдирд░реБрддреНрдкрд╛рджрди

рддреНрд░реБрдЯрд┐ рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдореИрдВ рдКрдкрд░ рджрд┐рдЦрд╛рдП рдЧрдП рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ _рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЙрди рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдЬрд┐рд╕рд╕реЗ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред

  • рдСрд░реНрдбрд░рд┐рдВрдЧ рдХреЛ INSTALLED_APPS рдореЗрдВ рд╕реНрд╡рд┐рдЪ рдХрд░реЗрдВ, рдЕрд░реНрдерд╛рдд:
INSTALLED_APPS = (
    'django.contrib.admin',
    'grappelli',
)
  • static/admin/js рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЛ рд╣рдЯрд╛рдПрдВ (рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдирд╛рдо рдмрджрд▓реЗрдВ)
  • python manage.py collectstatic --noinput рдЪрд▓рд╛рдПрдБ, рдЖрдЙрдЯрдкреБрдЯ рдкрде рдореЗрдВ django/contrib/admin рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕реЗ:
$ python manage.py collectstatic --noinput
Copying '.../django/contrib/admin/static/admin/js/inlines.js'
Copying '.../django/contrib/admin/static/admin/js/collapse.js'
Copying '.../django/contrib/admin/static/admin/js/related-widget-wrapper.js'
Copying '.../django/contrib/admin/static/admin/js/calendar.js'
Copying '.../django/contrib/admin/static/admin/js/collapse.min.js'
Copying '.../django/contrib/admin/static/admin/js/urlify.js'
Copying '.../django/contrib/admin/static/admin/js/core.js'
Copying '.../django/contrib/admin/static/admin/js/jquery.js'
Copying '.../django/contrib/admin/static/admin/js/actions.min.js'
Copying '.../django/contrib/admin/static/admin/js/jquery.init.js'
Copying '.../django/contrib/admin/static/admin/js/inlines.min.js'
Copying '.../django/contrib/admin/static/admin/js/actions.js'
Copying '.../django/contrib/admin/static/admin/js/jquery.min.js'
Copying '.../django/contrib/admin/static/admin/js/timeparse.js'
Copying '.../django/contrib/admin/static/admin/js/SelectBox.js'
Copying '.../django/contrib/admin/static/admin/js/prepopulate.min.js'
Copying '.../django/contrib/admin/static/admin/js/SelectFilter2.js'
Copying '.../django/contrib/admin/static/admin/js/LICENSE-JQUERY.txt'
Copying '.../django/contrib/admin/static/admin/js/prepopulate.js'
Copying '.../django/contrib/admin/static/admin/js/admin/RelatedObjectLookups.js'
Copying '.../django/contrib/admin/static/admin/js/admin/DateTimeShortcuts.js'

21 static files copied to '.../static', 593 unmodified.
  • рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реЗ рдкрд░реАрдХреНрд╖рдг, рдЙрд╕ рдкрд░ рдлрд╝рд┐рд▓реНрдЯрд░ рдмрдЯрди рдХреЗ рд╕рд╛рде рдкреГрд╖реНрда рдХреЗ рдкреВрд░реНрдг рдкреБрдирдГ рд▓реЛрдб рдХреЗ рд╕рд╛рде -- рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрдЯ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП

рддреНрд░реБрдЯрд┐ рдХреЛ рдареАрдХ рдХрд░рдирд╛

рд╕рдорд╛рдзрд╛рди рдЪрд░рдг рд▓рдЧрднрдЧ рд╕рдорд╛рди рд╣реИрдВ:

  • INSTALLED_APPS рдореЗрдВ рдХреНрд░рдо рдХреЛ рдареАрдХ рдХрд░реЗрдВ, рдЕрд░реНрдерд╛рдд:
INSTALLED_APPS = (
    'grappelli',
    'django.contrib.admin',
)
  • static/admin/js рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЛ рд╣рдЯрд╛рдПрдВ (рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдирд╛рдо рдмрджрд▓реЗрдВ)
  • python manage.py collectstatic --noinput рдЪрд▓рд╛рдПрдБ, рдЖрдЙрдЯрдкреБрдЯ рдкрде рдореЗрдВ grappelli рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕реЗ:
$ python manage.py collectstatic --noinput
Copying '.../grappelli/static/admin/js/SelectFilter2.js'
Copying '.../grappelli/static/admin/js/collapse.min.js'
Copying '.../grappelli/static/admin/js/actions.min.js'
Copying '.../grappelli/static/admin/js/inlines.js'
Copying '.../grappelli/static/admin/js/urlify.js'
Copying '.../grappelli/static/admin/js/related-widget-wrapper.js'
Copying '.../grappelli/static/admin/js/collapse.js'
Copying '.../grappelli/static/admin/js/jquery.js'
Copying '.../grappelli/static/admin/js/jquery.min.js'
Copying '.../grappelli/static/admin/js/calendar.js'
Copying '.../grappelli/static/admin/js/prepopulate.js'
Copying '.../grappelli/static/admin/js/prepopulate.min.js'
Copying '.../grappelli/static/admin/js/actions.js'
Copying '.../grappelli/static/admin/js/core.js'
Copying '.../grappelli/static/admin/js/LICENSE-JQUERY.txt'
Copying '.../grappelli/static/admin/js/timeparse.js'
Copying '.../grappelli/static/admin/js/SelectBox.js'
Copying '.../grappelli/static/admin/js/inlines.min.js'
Copying '.../grappelli/static/admin/js/jquery.init.js'
Copying '.../grappelli/static/admin/js/admin/RelatedObjectLookups.js'
Copying '.../grappelli/static/admin/js/admin/DateTimeShortcuts.js'

21 static files copied to '.../static', 593 unmodified.
  • рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реЗ рдкрд░реАрдХреНрд╖рдг, рдЙрд╕ рдкрд░ рдлрд╝рд┐рд▓реНрдЯрд░ рдмрдЯрди рдХреЗ рд╕рд╛рде рдкреГрд╖реНрда рдХреЗ рдкреВрд░реНрдг рдкреБрдирдГ рд▓реЛрдб рдХреЗ рд╕рд╛рде -- рддреНрд░реБрдЯрд┐ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП
рд╕рдорд╕реНрдпрд╛ рдХреНрдпреЛрдВ рд╣реЛ рд░рд╣реА рд╣реИ?
  • collectstatic рдХреЛ $#$ 'grappelli' $#$ рдХреЗ рдмрдЬрд╛рдп 'django.contrib.admin' static/admin/js рдлрд╝рд╛рдЗрд▓реЗрдВ рдорд┐рд▓ рд░рд╣реА рд╣реИрдВ
рдпрд╣ рдХреИрд╕реЗ рд╣реЛ рд╕рдХрддрд╛ рдерд╛?
  1. рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рджрд┐рдЦрд╛рдП рдЧрдП рдЪрд░рдгреЛрдВ рдореЗрдВ, INSTALLED_APPS рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдСрд░реНрдбрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
  2. рджреВрд╕рд░рд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ collectstatic рдХреЛ 'django.contrib.admin' рдХреЗ рд▓рд┐рдП 'grappelli' рд╕реЗ рдкрд╣рд▓реЗ рдХрднреА рднреА рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛
  3. ...

рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ

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

рд╕рдм рдХреБрдЫ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ collectstatic рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ

https://docs.djangoproject.com/hi/dev/ref/contrib/staticfiles/#collectstatic :

рдмрд╛рдж рдореЗрдВ collectstatic рдЪрд▓рддрд╛ рд╣реИ (рдпрджрд┐ STATIC_ROOT рдЦрд╛рд▓реА рдирд╣реАрдВ рд╣реИ), рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдХреЗрд╡рд▓ рддрднреА рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ рдЬрдм рдЙрдирдХреЗ рдкрд╛рд╕ STATIC_ROOT рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрд╢реЛрдзрд┐рдд рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рд╣реЛ ред рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ INSTALLED_APPS рд╕реЗ рд╣рдЯрд╛рддреЗ рд╣реИрдВ, рддреЛ рдкреБрд░рд╛рдиреА рд╕реНрдерд┐рд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП --clear рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред

  • рдКрдкрд░ рдЬреЛрд░ рдореЗрд░рд╛ рд╣реИ
  • рд╕рдВрднрд╛рд╡рд┐рдд рдкрд░рд┐рджреГрд╢реНрдп:

    • рдЧрд▓рдд static/admin/js рдЬрдЧрд╣ рдкрд░

    • рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ INSTALLED_APPS . рдореЗрдВ рдСрд░реНрдбрд░ рдХрд░рдирд╛ рд╕рд╣реА рдХрд┐рдпрд╛ рд╣реИ

    • рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╕рд┐рд╕реНрдЯрдо рдкрд░ рд╕рдВрд╢реЛрдзрди рдХреА рддрд╛рд░реАрдЦреЗрдВ рдкреНрд░рддрд┐рдХреВрд▓ рд╣реИрдВ, рдЕрд░реНрдерд╛рдд:

    • grappelli/static/admin/js < static/admin/js

  • рдкрд░рд┐рдгрд╛рдо рдХреБрдЫ рдРрд╕рд╛ рд╣реЛрдЧрд╛:
$ python manage.py collectstatic --noinput

0 static files copied to '.../static', 614 unmodified.
  • рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХреЗ рд▓рд┐рдП рд╕рдВрд╢реЛрдзрди рддрд┐рдерд┐ рдмрджрд▓реЗрдВ, рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЗрд╕реЗ рддрдм рдПрдХрддреНрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
$ touch .../grappelli/static/admin/js/jquery.init.js 
$ python manage.py collectstatic --noinput
Copying '.../grappelli/static/admin/js/jquery.init.js'

1 static file copied to '.../static', 613 unmodified.
  • рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдмрдЬрд╛рдп static рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╕рдВрд╢реЛрдзрди рддрд┐рдерд┐рдпреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╢рд╛рдпрдж рдХрд╣реАрдВ рдЕрдзрд┐рдХ рдЙрдкрдпреБрдХреНрдд рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
$ touch -d 2000-01-01 .../static/admin/js/jquery.init.js 
$ python manage.py collectstatic --noinput
Copying '.../grappelli/static/admin/js/jquery.init.js'

1 static file copied to '.../static', 613 unmodified.
  • рддреЛ рд╕рдВрдкреВрд░реНрдг static/admin/js рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ рд▓рд┐рдП:
$ find .../static/admin/js -type f -exec touch -d 2000-01-01 {} \;
$ python manage.py collectstatic --noinput
Copying '.../grappelli/static/admin/js/SelectFilter2.js'
Copying '.../grappelli/static/admin/js/collapse.min.js'
Copying '.../grappelli/static/admin/js/actions.min.js'
Copying '.../grappelli/static/admin/js/inlines.js'
Copying '.../grappelli/static/admin/js/urlify.js'
Copying '.../grappelli/static/admin/js/related-widget-wrapper.js'
Copying '.../grappelli/static/admin/js/collapse.js'
Copying '.../grappelli/static/admin/js/jquery.js'
Copying '.../grappelli/static/admin/js/jquery.min.js'
Copying '.../grappelli/static/admin/js/calendar.js'
Copying '.../grappelli/static/admin/js/prepopulate.js'
Copying '.../grappelli/static/admin/js/prepopulate.min.js'
Copying '.../grappelli/static/admin/js/actions.js'
Copying '.../grappelli/static/admin/js/core.js'
Copying '.../grappelli/static/admin/js/LICENSE-JQUERY.txt'
Copying '.../grappelli/static/admin/js/timeparse.js'
Copying '.../grappelli/static/admin/js/SelectBox.js'
Copying '.../grappelli/static/admin/js/inlines.min.js'
Copying '.../grappelli/static/admin/js/jquery.init.js'
Copying '.../grappelli/static/admin/js/admin/RelatedObjectLookups.js'
Copying '.../grappelli/static/admin/js/admin/DateTimeShortcuts.js'

21 static files copied to '.../static', 593 unmodified.
  • --clear рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рдЬреИрд╕рд╛ рдХрд┐ рд╢реБрд░реБрдЖрдд рдореЗрдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ; рдХреБрдЫ рдЕрд╡рд▓реЛрдХрди:

    • рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ ...

    • ... рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рдЖрдХреНрд░рд╛рдордХ рд╕рдорд╛рдзрд╛рди рд╣реИ, рдЬреЛ рдЕрдиреНрдп рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕реНрдерд┐рд░ рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рд╣рдЯрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рд╕рдорд╛рди STATIC_ROOT рд╕рд╛рдЭрд╛ рдХрд░рддреЗ рд╣реИрдВ

    • рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╕рд╛рдорд╛рдиреНрдп рдЕрдиреБрд╢рдВрд╕рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИ

рдирддреАрдЬреЛрдВ

3 рд╡рд░реНрд╖реЛрдВ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рд╕реЗ рд╕рдХреНрд░рд┐рдп рдпрд╣ рдореБрджреНрджрд╛ рдЗрд╕ collectstatic рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдкреНрд░рдорд╛рдг рд╣реИред рдЬреЛ рдЪреАрдЬ рдЗрд╕реЗ рдФрд░ рднреА рд╕реНрд╡рд╛рджрд┐рд╖реНрдЯ рдмрдирд╛рддреА рд╣реИ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ "рдмрдЧ" рд╕рд╣реА рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдЦреБрдж рдХреЛ рд╣рд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рдЙрджрд╛рд╣рд░рдг:

  • рд╡рд┐рднрд┐рдиреНрди рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рдмреАрдЪ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЧреНрд░реЗрдкреЗрд▓реА рдХреЛ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рддрд╛ рд╣реИ, рдирдИ static/admin/js рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкреЗрд╢ рдХрд░рддрд╛ рд╣реИ, рд╡рд░реНрддрдорд╛рди рдореЗрдВ STATIC_ROOT рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╣рд╛рд▓рд┐рдпрд╛ рд╕рдВрд╢реЛрдзрди рддрд┐рдерд┐рдпреЛрдВ рдХреЗ рд╕рд╛рдеред

    • рдлрд┐рд░ рднреА, рдлрд╝рд┐рд▓реНрдЯрд░ рдмрдЯрди рд╣рдардкреВрд░реНрд╡рдХ рдХрд╛рдо рдХрд░рдиреЗ рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ

  • рднрд╡рд┐рд╖реНрдп рдХреЗ рдХрд┐рд╕реА рд╕рдордп рдореЗрдВ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ collectstatic . рдЪрд▓рд╛рддрд╛ рд╣реИ

    • рдЕрдЪрд╛рдирдХ, рдлрд╝рд┐рд▓реНрдЯрд░ рдмрдЯрди рдлрд┐рд░ рд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ

рдПрдХ рдЖрджрд░реНрд╢ рджреБрдирд┐рдпрд╛ рдореЗрдВ:

  • collectstatic рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрди-рдмреАрдЪ рдХреА рд╕реЗрдЯрд┐рдВрдЧ, --replace рдпрд╛ --overwrite рдпрд╛ --ignore-timestamps рдЬреИрд╕реА рдХреЛрдИ рдЪреАрдЬрд╝
  • рдореВрд▓ рд░реВрдк рд╕реЗ:

    • рд╕рднреА рд╕реНрдерд┐рд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдвреВрдВрдвреЗрдВ рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХрд░рддрд╛ рд╣реИ

    • рдореМрдЬреВрджрд╛ рд╕реНрдерд┐рд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рдЙрдиреНрд╣реЗрдВ рдХреЙрдкреА рдХрд░реЗрдВ

    • STATIC_ROOT . рдореЗрдВ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕реНрдерд┐рд░ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕реНрдкрд░реНрд╢ рди рдХрд░реЗрдВ

рдЕрдм рдЕрдЧрд░ рдпрд╣ рдЖрджрд░реНрд╢ рджреБрдирд┐рдпрд╛ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИ, рддреЛ рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдмрддрд╛рдПрдВред рд╢рд╛рдпрдж рдпрд╣ рдореБрджреНрджрд╛ рднреА рдЖрдЦрд┐рд░рдХрд╛рд░ рдмрдВрдж рд╣реЛ рдЬрд╛рдП!

"рдХрдпрд╛рдордд рдХреА рдлрд╛рдЗрд▓"

рдЕрдВрдд рдореЗрдВ, рдпрд╣ рдкреВрд░реА рдЪрд░реНрдЪрд╛ рдЕрдкрд░рд╛рдзреА рдХреА рдкрд╣рдЪрд╛рди рдХрд┐рдП рдмрд┐рдирд╛ рдкреВрд░реА рдирд╣реАрдВ рд╣реЛрдЧреА, рдХреЛрдб рдХреА рд╕рдЯреАрдХ рд░реЗрдЦрд╛ рдХреЛ рдЫреВрддреЗ рд╣реБрдП рдЬрд┐рд╕рдиреЗ рдЗрддрдирд╛ рджрд░реНрдж рджрд┐рдпрд╛ рд╣реИ!

рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдЪреБрдкрдХреЗ рд╕реЗ рдЗрд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдКрдкрд░ рдХрд░ рджрд┐рдпрд╛ рд╣реИ... рдФрд░ рдпрд╣ рд╣реИ...:

  • static/admin/js/jquery.init.js !!! рд▓реЗрдХрд┐рди рддреБрдо рд╕рдм рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рдЪреБрдХреЗ рдереЗ, рд╣реИ рдирд╛?!

рдпрджрд┐ рдЧреНрд░реЗрдкреЗрд▓реА collectstatic рд▓рдбрд╝рд╛рдИ рдЬреАрддрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдкрд╛рдПрдВрдЧреЗ рдХрд┐ рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:

// dropped
// not used in grappelli
// kept this file to prevent 404

рдлрд┐рд░ рднреА рдЕрдЧрд░ Django-Admin рдЯреНрд░рдореНрдк рдмрд╛рд╣рд░ рдЖрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдкрд╛рдПрдВрдЧреЗ:

/* Puts the included jQuery into our own namespace using noConflict and passing
 * it 'true'. This ensures that the included jQuery doesn't pollute the global
 * namespace (i.e. this preserves pre-existing values for both window.$ and
 * window.jQuery).
 */
var django = django || {};
django.jQuery = jQuery.noConflict(true);
  • рддреЛ, рдЗрд╕ рд╕рдм рдХреЗ рдмрд╛рдж рдмрд╕ рдПрдХ 2-рдкрдВрдХреНрддрд┐ js рдлрд╝рд╛рдЗрд▓
  • рдФрд░ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрдЦрд┐рд░реА рдкрдВрдХреНрддрд┐ рд╣реИ рдЬреЛ рд╕рдВрдХрдЯрдореЛрдЪрдХ рд╣реИ - рдЗрд╕реЗ рдЯрд┐рдкреНрдкрдгреА рдХрд░реЗрдВ рдФрд░ рдлрд╝рд┐рд▓реНрдЯрд░ рдмрдЯрди рдлрд┐рд░ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ

рдзреНрдпрд╛рди рджреЗрдВ: рдореИрдВ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдлрд┐рд▓реНрдЯрд░ рдмрдЯрди рдХреЛ рдлрд┐рд░ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреА рд╡рдХрд╛рд▓рдд рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ - рдмрд╕ рдЗрд╕ рдЦреЛрдЬ рдХреЛ рд╡рд╣рд╛рдВ рд╕реЗ рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдЭрд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

@myii рд╢реЛрдз рдФрд░ рдмрд╣реБрдд рд╡рд┐рд╕реНрддреГрдд рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рджред рдЖрдк рдЬреЛ рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ (рдЕрднреА рднреА рдордЬрд╛рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдХрднреА рднреА рдХрд┐рд╕реА рднреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╕рд╛рде рднрд╛рдЧ рдирд╣реАрдВ рд▓рд┐рдпрд╛ рд╣реИ)ред

@myii рдзрдиреНрдпрд╡рд╛рджред рдореИрдВрдиреЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ Ansible рдореЗрдВ рдЕрдкрдиреА рддреИрдирд╛рддреА рдХреЗ рд▓рд┐рдП рдЪрд░рдгреЛрдВ рдХреЛ рдЬреЛрдбрд╝рд╛, рдФрд░ рдлрд┐рд░ рдХрд▓реЗрдХреНрдЯрд┐рдХ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЪрд▓рд╛рдпрд╛ (рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ):

- name: 'manage.py collectstatic'
  django_manage: app_path={{common_htdocs_dir}}/fos
                 command=collectstatic
                 settings=fos.settings
                 virtualenv={{common_htdocs_dir}}/fos-venv
  when: code.changed or code_deps.changed or settings.changed
  tags:
    - fos
    - collectstatic

# Next two steps, credits to <strong i="7">@myii</strong>
# https://github.com/sehmaschine/django-grappelli/issues/214#issuecomment-158576652
- name: "Move Django's admin assets to avoid conflict with Grapelli's"
  command: mv {{common_htdocs_dir}}/fos/static/admin/js {{common_htdocs_dir}}/fos/static/admin/js-already-moved creates={{common_htdocs_dir}}/fos/static/admin/js-already-moved
  tags:
    - fos
    - collectstatic
    - grapelli

# Using command directly so ----no-post-process can be passed, for extra speed
- name: "Re-run collectstatic to replace admin assets with Grapelli's"
  command: '{{common_htdocs_dir}}/fos-venv/bin/python ./manage.py collectstatic --no-color --noinput --no-post-process chdir={{common_htdocs_dir}}/fos'
  tags:
    - fos
    - collectstatic

рд╕реМрднрд╛рдЧреНрдп рд╕реЗ рдЧреНрд░реЗрдкреЗрд▓реА рдХреЛ рдкреЛрд╕реНрдЯ-рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдХреЗрд╡рд▓ рдЬреЗрдПрд╕ рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реЛрддрд╛ рд╣реИред

рдореБрдЭреЗ рд╡рд╣реА рддреНрд░реБрдЯрд┐ рдорд┐рд▓реА, рдЗрд╕реЗ рдЬреЛрдбрд╝рд╛ рдФрд░ рдЗрд╕рдиреЗ рдХрд╛рдо рдХрд┐рдпрд╛
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
'django.contrib.staticfiles.finders.FileSystemFinder',
}

;)

рд╣рд╛рдп рд╕рдм, Django 1.9.8 / Grappelli 2.8ред, рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдЕрднреА рднреА рд╣реЛрддреА рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рд╕реНрдерд┐рд░ рдлрд╛рдЗрд▓ рд╕реЗрдЯрдЕрдк рдХреЗ рд╕рд╛рде рдЙрддреНрдкрд╛рджрди рдореЗрдВ рднреАред

рдХреНрдпрд╛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ 'рд╕рд░рд▓' рдЙрдкрд╛рдп рд╣реИ? рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдореЗрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдЬреЗрдПрд╕ рдХрднреА рднреА рд▓реЛрдб рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

рдорд╛рд░реНрдХреВ,

рдХреНрдпрд╛ grappelli рдкрд╣рд▓реЗ INSTALLED_APPS рдореЗрдВ рд╣реИ?

INSTALLED_APPS = (
    'grappelli',
    'django.contrib.admin',
)

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

@marcoooo рдКрдкрд░ рджрд┐рдП рдЧрдП рдореЗрд░реЗ рд▓рдВрдмреЗ рдЙрддреНрддрд░ рдФрд░ @Tatsh рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрд╡рд░реНрддреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдореЗрд░реЗ рдкрд╛рд╕ рдЖрдкрдХреЗ рд▓рд┐рдП 2-рдЪрд░рдгреАрдп рд╕рд╛рд░рд╛рдВрд╢ рд╣реИ:

  1. static/admin/js рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЛ рд╕рд╛рдлрд╝/рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВ
  2. collectstatic рдлрд┐рд░ рд╕реЗ рдЪрд▓рд╛рдПрдБ

рдЬрдм рддрдХ рдЖрдкрдХреЛ @ecederstrand рджреНрд╡рд╛рд░рд╛ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╕рд╣реА рдХреНрд░рдо рдорд┐рд▓ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЖрдк рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреЗ рд╣реЛрдВрдЧреЗред

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

  • рдРрдкреНрд╕ рдореЗрдВ рдСрд░реНрдбрд░ рдХрд░рдирд╛ рдареАрдХ рд╣реИ (рдЪреВрдВрдХрд┐ рдЙрд▓реНрдЯреЗ рдХреНрд░рдо рдореЗрдВ, рдореБрдЭреЗ рдЧреНрд░реЗрдкреЗрд▓реА рд╢реИрд▓реА рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рдорд┐рд▓реЗрдЧреА)
  • рдореИрдВ рд╕рдВрдЧреНрд░рд╣рдгреАрдп рдЪрд▓рд╛рддрд╛ рд╣реВрдВ, рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдлрд╝рд╛рдЗрд▓реЗрдВ рдлрд┐рд░ рд╕реЗ рдЖрддреА рд╣реИрдВ (рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдлрд╝реЛрд▓реНрдбрд░ рд╣рдЯрд╛ рджрд┐рдпрд╛)
  • рдкрде рд╣реИ (рдкреНрд░реЛрдЬреЗрдХреНрдЯ ~/staticfiles/ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖) рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░рд╛ рдХреЙрдиреНрдлрд┐рдбреЗрдВрд╕ рд╕рд╣реА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЕрдиреНрдп рд╕рднреА рд╕реНрдЯреЗрдЯрд┐рдХреНрд╕ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкрд░реЛрд╕реЗ рдЬрд╛рддреЗ рд╣реИрдВ (рдореЗрд░реЗ urls.py рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдХреЛрдИ urlpatterns рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ Django doc рдореЗрдВ рдЕрдиреБрд╢рдВрд╕рд┐рдд рд╣реИ)

рдЕрднреА рднреА рдпрд╣ рдореБрджреНрджрд╛ рдорд┐рд▓рд╛ рд╣реИред

Django рдкреИрдХреЗрдЬ рд╕реНрдерд╛рдкрд┐рдд:

django-рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ-рдХреНрд░рдордмрджреНрдз (2.0.18)
django-authtools (1.5.0)
django-рдмреВрдЯрд╕реНрдЯреНрд░реИрдк-рдереАрдо (3.3.6)
django-рдмреНрд░реЗрд╕рд┐рдЬрд╝ (1.9.0)
django-ckeditor (5.1.0)
django-cors-headers (1.1.0)
django-рджреЗрд╢ (3.4.1)
django-рдХреБрд░рдХреБрд░рд╛-рд░реВрдк (1.6.0)
django-crontab (0.7.1)
django-рдбреАрдмрдЧ-рдЯреВрд▓рдмрд╛рд░ (1.5)
django-eav (0.9.2, /home/marc/.virtualenvs/waves1/src/django-eav)
django-рдкрд░реНрдпрд╛рд╡рд░рдг (0.4.0)
django-grappelli (2.8.1)
django-ipware (1.1.5)
django-jquery (1.12.2)
django-jquery-ui (1.11.4.1)
django-рд▓реЙрдЧ-рдлрд╝рд╛рдЗрд▓-рджрд░реНрд╢рдХ (0.9)
django-рдореЗрд▓-рдЯреЗрдореНрдкрд▓реЗрдЯ (2.6.2)
django-mptt (0.8.4)
django-рдорд▓реНрдЯреАрдЕрдкрд▓реЛрдб (0.5.1)
django-рдиреЗрд╕реНрдЯреЗрдб-рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ (3.0.8)
django-рдмрд╣реБрд░реВрдкреА (1.0.1)
django-рдкрдВрдЬреАрдХрд░рдг (2.1.2)
django-smart-selects (1.2.2)
django-рдЯреИрдмреНрдб-рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ (1.0.0)
djangorestрдврд╛рдВрдЪрд╛ (3.4.0)
djangorestframework-jwt (1.8.0)
djangorestframework-xml (1.3.0)
drfdocs (0.0.11)

рд╕реНрдерд┐рд░ рд╕реЗрд╡рд╛ рд╕реЗрдЯрдЕрдк рдХреЗ рд╕рд╛рде рдЕрдкрд╛рдЪреЗ рдкрд░ рдЪрд▓ рд░рд╣рд╛ рд╣реИ:

<рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ [ABSOLUTE_PATH_TO_WAVES_INSTALL_DIR]/src/waves_services>
рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВSymLinks рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛
<рдлрд╝рд╛рдЗрд▓реЗрдВ wsgi.py>
рд╕рднреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
</ рдлрд╝рд╛рдЗрд▓реЗрдВ>
</ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛>
<рд╕реНрдерд╛рди /рд╕реНрдерд┐рд░>
рд╕реЗрдЯрд╣реИрдВрдбрд▓рд░ рдХреЛрдИ рдирд╣реАрдВ
</рд╕реНрдерд╛рди>
<рд╕реНрдерд╛рди /рдореАрдбрд┐рдпрд╛>
рд╕реЗрдЯрд╣реИрдВрдбрд▓рд░ рдХреЛрдИ рдирд╣реАрдВ
</ рд╕реНрдерд╛рди>
рдЙрдкрдирд╛рдо /рдореАрдбрд┐рдпрд╛ [ABSOLUTE_PATH_TO_WAVES_INSTALL_DIR]/рдореАрдбрд┐рдпрд╛
рдЙрдкрдирд╛рдо /рд╕реНрдерд┐рд░ [ABSOLUTE_PATH_TO_WAVES_INSTALL_DIR]/рд╕реНрдереИрддрд┐рдХ рдлрд╝рд╛рдЗрд▓реЗрдВ

рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП: action.js рдореЗрдВ рдХреНрд░рд┐рдпрд╛() рдлрд╝рдВрдХреНрд╢рди рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдореЗрд░реЗ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдкреГрд╖реНрдареЛрдВ рдореЗрдВ рд▓реЛрдб рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ (рдореИрдВ рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ base_site.html рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реВрдВ)ред рдХреНрдпрд╛ рдореБрдЭреЗ рдЗрд╕ рдЭреБрдХрд╛рд╡ рдХреЛ рдЕрдкрдиреЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП? рдореИрдВрдиреЗ рдЧреНрд░реЗрдкреЗрд▓реА рд╕реНрд░реЛрддреЛрдВ рдореЗрдВ рдХрд┐рд╕реА рднреА рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдЗрд╕ рдЖрдпрд╛рдд рдХрд╛ рдХреЛрдИ рдирд┐рд╢рд╛рди рдирд╣реАрдВ рджреЗрдЦрд╛ред

рд╕рдордЭ рд▓рд┐рдпрд╛ !

рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП рдпрд╣ рдорджрджрдЧрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред (рд▓реЗрдХрд┐рди рд╡реИрд╕реЗ рднреА, рдХреНрдпрд╛ рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ base_site.html рдЧреНрд░реЗрдкреЗрд▓реА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП?)

рдореИрдВ рд╕рдВрдЧреНрд░рд╣рдгреАрдп рдЪрд▓рд╛рддрд╛ рд╣реВрдВ, рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдлрд╝рд╛рдЗрд▓реЗрдВ рдлрд┐рд░ рд╕реЗ рдЖрддреА рд╣реИрдВ (рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдлрд╝реЛрд▓реНрдбрд░ рд╣рдЯрд╛ рджрд┐рдпрд╛)

@marcoooo рдХреЗрд╡рд▓ collectstatic рд╕реЗ рдкрд╣рд▓реЗ рдлрд╝реЛрд▓реНрдбрд░ рдХреЛ рд╣рдЯрд╛ рджреЗрдВред рдЬрдм рдЖрдк collectstatic рдлрд┐рд░ рд╕реЗ рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕рд╣реА рдлрд╝рд╛рдЗрд▓реЗрдВ рдмрдирд╛рддрд╛ рд╣реИ _рдЬрд┐рд╕реЗ рдЖрдкрдХреЛ рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ_ред

рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░!
рд╣рдорд╛рд░реЗ рдпрд╣рд╛рдВ рдПрдХ рд╣реА рдореБрджреНрджрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдПрдХ рдЕрд▓рдЧ рдкрд░рд┐рджреГрд╢реНрдп рдХреЗ рд╕рд╛рде:

  • RPM рдХреЗ рд╕рд╛рде рдкреИрдХ рдХрд┐рдП рдЧрдП 2 рд╡рд░реНрдЪреБрдЕрд▓рдПрдиреНрд╡реНрд╕
  • рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рдкрд╛рд╕ рдЧреНрд░реЗрдкреЗрд▓реА рд╣реИ
    рд╣рдорд╛рд░реА рд╕реНрдерд┐рд░ рдлрд╛рдЗрд▓реЗрдВ рд╡рд░реНрдЪреБрдЕрд▓рдПрдиреНрд╡ рдореЗрдВ рд╕рд╛рдЭрд╛ рдХреА рдЬрд╛рддреА рд╣реИрдВ рдФрд░ рдХрд▓реЗрдХреНрдЯрд╛рдЯрд┐рдХ рдХреЛ рдкрд╣рд▓реЗ рдЙрд╕ рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдЪрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЧреНрд░реЗрдкреЗрд▓реА рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред
    рдлрд╛рдЗрд▓реЛрдВ рдХрд╛ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк RPM рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рддрд╛рд░реАрдЦ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЧреНрд░реЗрдкреЗрд▓рд┐рд╕ рдФрд░ Djando рд╕реНрдЯреИрдЯрд┐рдХ рдПрдбрдорд┐рди рдлрд╛рдЗрд▓реЗрдВ рд▓рдЧрднрдЧ рдПрдХ рд╣реА рдбреЗрдЯрд╛рдЯрд╛рдЗрдо рдЦрд╛ рдЬрд╛рддреА рд╣реИрдВред

рдЕрдЧрд░ рдХрд┐рд╕реА рдФрд░ рдХреЛ рдпрд╣ рдкрд░рд┐рджреГрд╢реНрдп рдорд┐рд▓рд╛ рд╣реИ рддреЛ рд╕рд╛рд╡рдзрд╛рди рд░рд╣реЗрдВред рд╣рдорд╛рд░рд╛ рд╕рдорд╛рдзрд╛рди (рдЕрднреА рдХреЗ рд▓рд┐рдП) рд╕рдВрдЧреНрд░рд╣ рдХреЗ рдмрд╛рдж рдЧреНрд░реЗрдкреЗрд▓реА рдХреА рд╕реНрдерд┐рд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХреЙрдкреА рдХрд░рдирд╛ рд╣реИред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

johncpang picture johncpang  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

FrozenAlex picture FrozenAlex  ┬╖  15рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

asfaltboy picture asfaltboy  ┬╖  11рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

bob-r picture bob-r  ┬╖  9рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

adamchainz picture adamchainz  ┬╖  24рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ