Django-grappelli: Chrome, FF์˜ Javascript ์˜ค๋ฅ˜๋กœ ์ธํ•ด ํ•„ํ„ฐ ๋“œ๋กญ๋‹ค์šด์ด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2011๋…„ 08์›” 01์ผ  ยท  31์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: sehmaschine/django-grappelli

๋ฐฉ๊ธˆ Django 1.4.0 ์•ŒํŒŒ์™€ ํ•จ๊ป˜ django-grappelli 2.3.4๋ฅผ ์„ค์น˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ ๋ชฉ๋ก ํŽ˜์ด์ง€์˜ ํ•„ํ„ฐ ๋“œ๋กญ๋‹ค์šด ์ƒ์ž๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ๋ชจ๋‘ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. Chrome ๋ฐ Firefox์—์„œ Javascript ์˜ค๋ฅ˜๋ฅผ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค.

Uncaught TypeError: Object #<Object> has no method 'actions'
(anonymous function):8000/admin/msdb/incident/:59
c.extend.readyjquery-1.4.2.min.js:26
L

๊ด€๋ จ ์ฝ”๋“œ๋Š” templates/admin/change_list.html์— ์žˆ์Šต๋‹ˆ๋‹ค. ์ˆ˜์ •์ด ๋ธ”๋ก์„ ์›€์ง์ด๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค

{% if action_form %}
  ...
{% endif %}

{{ media.js }} ๋ฐ”๋กœ ๋’ค์˜ 19๋ฒˆ์งธ ์ค„์—์„œ 65๋ฒˆ์งธ ์ค„๊นŒ์ง€. actions.js ์Šคํฌ๋ฆฝํŠธ๊ฐ€ media.js ์— ํฌํ•จ๋œ ๋ธ”๋ก์— ๋กœ๋“œ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” _after_ ๊ด€๋ จ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด Django ์ฝ”๋“œ๊ฐ€ ์•„์ง ์•ŒํŒŒ ์ƒํƒœ์ธ ๊ฒฐ๊ณผ์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ๋ณด๊ณ ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

templates/admin/includes_grappelli/header.html grp_collapsible ์— ์˜ํ•ด ๋™์‹œ์— ๋‹ค๋ฅธ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

Uncaught TypeError: Object #<Object> has no method 'grp_collapsible'

๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์„ ๊ณ ์น  ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฆ…๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋‚˜์—๊ฒŒ ๋ฌธ์ œ๋Š” ์—ฌ์ „ํžˆ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.
ํŒŒ์ด์ฌ 2.7, ์žฅ๊ณ  1.9.6, ๊ทธ๋ž˜ํŽ ๋ฆฌ 2.8.1

๋ชจ๋“  31 ๋Œ“๊ธ€

django 1.3์œผ๋กœ ํ•ด๋ณด์…จ๋‚˜์š”?

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ 1.4.0a. ๋‚˜๋Š” ์•ฝ๊ฐ„ ๊ณจ์น˜์•„ํ”„์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์€
๊ทธ๋ž˜ํŽ ๋ฆฌ: ํ…œํ”Œ๋ฆฟ change_list ๋ฐ ์ˆœ์„œ
์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ ๋กœ๋”ฉ/์‹คํ–‰.

์ œ๊ฐ€ ์‹ ๊ณ ๋ฅผ ๋„ˆ๋ฌด ์„ฑ๊ธ‰ํ•˜๊ฒŒ ํ–ˆ์„ ์ˆ˜๋„ ์žˆ๊ณ , ์—„๊ฒฉํ•˜์ง€๋„ ์•Š์Šต๋‹ˆ๋‹ค.
๋‹ค๋ฅธ django ๋ฒ„์ „์œผ๋กœ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค!

์†”์งํžˆ ... ๊ทธ๋ž˜ํŽ ๋ฆฌ ์˜ค๋ฅ˜๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ˆ˜๋ฐฑ ๋ช…์˜ ์‚ฌ์šฉ์ž๊ฐ€ ํ•„ํ„ฐ ๋“œ๋กญ๋‹ค์šด์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ์ €๋Š” ๊ทธ๋ ‡๊ฒŒ ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด 1.4.0a ๋•Œ๋ฌธ์ด๋ผ๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค ... ๊ทธ๋ฆฌ๊ณ  grappelli๋Š” ํ•ญ์ƒ ์ตœ์‹  ๊ณต์‹ ๋ฆด๋ฆฌ์Šค์— ๋Œ€ํ•ด ๊ฐœ๋ฐœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์‚ฌ์‹ค์ž„์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•„ํ„ฐ ๋“œ๋กญ๋‹ค์šด์€ ๊ฝค ์˜ค๋žซ๋™์•ˆ django-trunk์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. swashbuckler๊ฐ€ ์ œ์•ˆํ•œ ๋Œ€๋กœ ์ฝ”๋“œ๋ฅผ ์ด๋™ํ•˜๊ธฐ ์œ„ํ•ด ์•„์ง Grappelli ํ…œํ”Œ๋ฆฟ์„ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

Grappelli๊ฐ€ django-trunk๋ฅผ ํ†ตํ•ด ์ตœ์‹  ์ƒํƒœ๋กœ ์œ ์ง€๋œ๋‹ค๋ฉด ๋” ์ž์„ธํžˆ ์‚ดํŽด๋ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. Django 1.4์—์„œ contrib.admin ๋ฏธ๋””์–ด๋ฅผ STATIC_URL๋กœ ์ด๋™ํ•˜๊ณ  ADMIN_MEDIA_PREFIX๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ๋งˆ์ง€๋ง‰ ๋Œ“๊ธ€์„ ์ฝ์œผ๋ฉด grappelli๊ฐ€ djangos trunk๋กœ ๊ฐœ๋ฐœ๋˜์ง€ ์•Š์•˜์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค, ๋„ˆ๋ฌด ๋นจ๋ฆฌ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค :)

djangos ํŠธ๋ ํฌ ๋ฒ„์ „๊ณผ ๊ด€๋ จ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ํ‹ฐ์ผ“์„ ๋‹ซ์Šต๋‹ˆ๋‹ค. ๋ฌธ์„œ๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜์—ˆ๊ณ  grappelli๋Š” ํ•ญ์ƒ ์ตœ์‹ ์˜ ์•ˆ์ •์ ์ธ django ๋ฆด๋ฆฌ์Šค์— ๋Œ€ํ•ด ๊ฐœ๋ฐœ๋œ๋‹ค๋Š” ๋ฉ”๋ชจ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” ๋ฉฐ์น  ์ „์— 1.4๊ฐ€ ๋ฆด๋ฆฌ์Šค๋œ ์ƒํƒœ์—์„œ ์ง€์†๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋ฌผ๋ก  gappelli๊ฐ€ django 1.4์™€ ํ˜ธํ™˜๋˜๋ฉด ์ˆ˜์ •๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

django1.4๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์—ฌ๊ธฐ์—์„œ ํ•˜๋‚˜๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. http://groups.google.com/group/django-grappelli/browse_thread/thread/7b929047d316275f

๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์„ ์‹œ๋„ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

django1.4๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ grappelli_2_4 ๋ถ„๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

cd ../lib/python2.7/site-packages
git init django-grappelli
cd django-grappelli
git remote add --track grappelli_2_4 grappelli_2_4 https://github.com/sehmaschine/django-grappelli.git
git fetch grappelli_2_4
git checkout grappelli_2_4
python setup.py install

์ง€๋‚œ๋ฒˆ์— ์ง€์ ์„ ํ™•์ธํ–ˆ์„ ๋•Œ ๋งˆํฌ์—…์— ํฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์–ด์„œ ๋น„์ฆˆ๋‹ˆ์Šค์—์„œ ๋Œ€๋ถ€๋ถ„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

django 1.4.2 ๋ฐ grappelli 2.4.3์œผ๋กœ ์žก๊ธฐ

Firefox 17์—์„œ Grappelli 2.4.3 + Django 1.4.3์„ ์‚ฌ์šฉํ•˜๊ณ  ํ•„ํ„ฐ๊ฐ€ ์žˆ๋Š” ํŽ˜์ด์ง€์— ๋‹ค์Œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

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

ํŽ˜์ด์ง€ ๋งค๊น€ ๋ง‰๋Œ€๊ฐ€ ์—ด๋ฆฌ์ง€ ์•Š๋Š” ํ•„ํ„ฐ๋กœ ๋ชฉ๋ก์˜ ๋งจ ์œ„๋กœ ์ด๋™ํ–ˆ์Šต๋‹ˆ๋‹ค(์ฒจ๋ถ€๋œ ์ด๋ฏธ์ง€ ์ฐธ์กฐ).

์บ์‹œ๋ฅผ ์ง€์›Œ๋„ ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Capture d e cran 2013-01-04 a 11 50 42

์‚ฌ์šฉ๋œ jquery๊ฐ€ ์ œ ๊ฒฝ์šฐ์—๋Š” ์ ์ ˆํ•˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค(์—ฌ๋Ÿฌ ๋ฒ„์ „์„ ๊ฐ€์ ธ์˜ค๊ณ  ์Šคํฌ๋ฆฝํŠธ๋Š” ๊ธฐ๋ณธ๊ฐ’ ๋Œ€์‹  "grp.jQuery"๋ฅผ ์‚ฌ์šฉํ•จ).
๋‹ค์Œ ์ฝ”๋“œ์—์„œ ํ…œํ”Œ๋ฆฟ์„ ์žฌ์ •์˜ํ•˜๊ณ  "grp.jQuery"๋ฅผ "django.jQuery"๋กœ ๋ฐ”๊ฟ” ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

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

๊ทธ ๊ฒฐ๊ณผ ๋‹ค์Œ ์ฝ”๋“œ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

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

grp.jQuery๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด js๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ ๋‹ค๋ฅธ ํ‹ฐ์ผ“์— ํ•ด๋‹น ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๊ณ  ์„ค์ • ๋ฌธ์ œ๋กœ ๋ฐํ˜€์กŒ์Šต๋‹ˆ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋กœ๋“œ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

@sehmaschine ๋‚ด ์˜๊ฒฌ์„ ์—…๋ฐ์ดํŠธํ–ˆ์Šต๋‹ˆ๋‹ค(์—†์Œ ๋Œ€์‹  "django.jQuery" ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์‚ฌ์šฉ).
grp.jQuery๋Š” ์‹ค์ œ๋กœ 1.7.2์ด๊ณ  django.jQuery๋Š” 1.4.2์ž…๋‹ˆ๋‹ค. admin ๋ฐ grappelli์—์„œ ์„ค์ •์„ ๋งŽ์ด ์‚ฌ์šฉ์ž ์ •์˜ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ๋“  ์ผ๋ถ€ ๊ตฌ์„ฑ ์„ค์ •์„ ๋†“์ณค์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๋ฌด์—‡์„ ๋˜๋Š” โ€‹โ€‹์–ด๋””์—์„œ ์•Œ์•„๋‚ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ •๋ณด๋ฅผ ์–ป์œผ๋ ค๋ฉด ์‹คํŒจํ•œ ์†Œ์Šค ํŒŒ์ผ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  "grp.jQuery"๋ฅผ "django.jQuery"๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด ํ•ด๊ฒฐ๋˜๋Š” ์œ„์น˜: https://gist.github.com/4452470

์ „์ฒด ์ฒดํฌ๋ฐ•์Šค( ) ์ง€๊ธˆ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์™œ grp.jQuery๊ฐ€ ์—†๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ž˜์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์•ž์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด grp.jQuery๊ฐ€ ์—†์œผ๋ฉด ๋งŽ์€ ๊ฒƒ๋“ค์ด ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(Django 1.5, Chrome 26). ๋ฌธ์ œ์˜ ์ค„( $("tr input.action-select").actions(); )์„ ๋Š์œผ๋ฉด grp.jQuery๊ฐ€ ์žˆ๊ณ  actions() ๋ฉ”์„œ๋“œ๊ฐ€ ์—†์„ ๋ฟ์ž…๋‹ˆ๋‹ค.

์•—. defrex์™€ ๊ฐ™์€ ๋ฌธ์ œ

@defrex ๋‹˜ ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ๋ณด๊ณ  ์žˆ์ง€๋งŒ actions.min.js๊ฐ€ ๋กœ๋“œ๋  ๋•Œ๋งŒ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. DEBUG=True์ด๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ๊ดœ์ฐฎ์•„ ๋ณด์ž…๋‹ˆ๋‹ค. @vongesell ๋„ ๊ทธ๊ฒƒ์„ ์•Œ์•„์ฐจ๋ ธ์Šต๋‹ˆ๊นŒ? ๋‘˜ ์ค‘ ํ•˜๋‚˜๋Š” ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๊นŒ?

์˜ˆ, Django์™€ Chrome์˜ ๋™์ผํ•œ ๋ฒ„์ „์ด๋ฉฐ grappelli 2.4.4๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋™์ผํ•œ ๋ฌธ์ œ, Django==1.5, django-grappelli==2.4.4, Ubuntu์˜ Firefox 22.0. ํŒŒ์ด์–ด๋ฒ„๊ทธ ์ฝ˜์†” ์ถœ๋ ฅ:

TypeError: $(...).actions๋Š” ํ•จ์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
[์ด ์˜ค๋ฅ˜ ์ค‘๋‹จ]

$("tr input.action-select").actions();

/api/a...kstate/ (55ํ–‰)

์—ฌ๊ธฐ์„œ๋„ ๋ด…๋‹ˆ๋‹ค. ์ œ ๊ฒฝ์šฐ์—๋Š” actions.js ์˜ Grappelli ๋ฒ„์ „์ด $# collectstatic /static/admin/js/ ์— ๋ณต์‚ฌ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ˆ˜๋™์œผ๋กœ ๋ณต์‚ฌํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. prepopulate.js ์™€ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

@bjudson ํžŒํŠธ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ €์—๊ฒŒ๋Š” collectstatic์ด ๋ชจ๋“  ๊ฒƒ์„ ๋ณต์‚ฌํ•˜์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋‹ค์‹œ ์‹คํ–‰ํ–ˆ๊ณ  ์ด์ œ ๋ชจ๋“  ๊ฒƒ์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

Django 1.6 ๋ฐ Grappelli 2.5.0๊ณผ ๋™์ผํ•œ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. Vinyll์ด ์–ธ๊ธ‰ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ../grappelli/templates/admin/change_list.html์„ ํŒจ์น˜ํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

์žฅ๊ณ ==1.8.2
์žฅ๊ณ  ๊ทธ๋ž˜ํŽ ๋ฆฌ==2.7.1

๋ฌธ์ œ๊ฐ€ ๊ณ„์† ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. collectstatic์ด ์–ด๋–ค ์ด์œ ๋กœ gappellis admin/static ํด๋”๋ฅผ ์ฐพ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

์žฅ๊ณ ==1.8.3
์žฅ๊ณ  ๊ทธ๋ž˜ํŽ ๋ฆฌ==2.7.3

๋ฌธ์ œ๋Š” ์—ฌ์ „ํžˆ ์—ฌ๊ธฐ์— ์žˆ์Šต๋‹ˆ๋‹ค.

~django.contrib.admin.options.ModelAdmin# ๋ฏธ๋””์–ด:635
self.actions๊ฐ€ None์ด ์•„๋‹Œ ๊ฒฝ์šฐ:
js.append('actions%s.js' % ์ถ”๊ฐ€)

์ด ์Šˆํผ ์†์„ฑ์„ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ณ  ๋ฏธ๋””์–ด ์†์„ฑ์„ ์žฌ์ •์˜ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด ์ด ๋ฉ”์„œ๋“œ(์†์„ฑ)๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋Š” ModelAdmin ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ฉด ์ž‘์—…์ด ๋กœ๋“œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Form.media์˜ ํ™•์žฅ ๊ธฐ๋Šฅ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ•˜์œ„ ํด๋ž˜์Šค์˜ Media ํด๋ž˜์Šค์— ์ž‘์—…์„ ๋„ฃ์œผ๋ ค๊ณ  ํ•ด๋„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ํ•ด๋‹น ๋ฉ”์†Œ๋“œ์— ์ฒดํฌ ํฌ์ธํŠธ๋ฅผ ๋‘๊ณ  ํ˜ธ์ถœ๋˜๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

๋‚˜๋Š” ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๊ณ  nginx ๊ตฌ์„ฑ์„ ํŽธ์ง‘ํ•˜์—ฌ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.
์ „์—:
location /static/admin/ { alias /web/merv/env/lib/python3.4/site-packages/django/contrib/admin/static/admin/; }
location /static/ { alias /web/merv/files/static/; }
ํ›„์—:
location /static/ { alias /web/merv/files/static/; }

๋‚˜์—๊ฒŒ ๋ฌธ์ œ๋Š” ์—ฌ์ „ํžˆ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.
ํŒŒ์ด์ฌ 2.7, ์žฅ๊ณ  1.9.6, ๊ทธ๋ž˜ํŽ ๋ฆฌ 2.8.1

๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์›น ์‚ฌ์ดํŠธ์˜ nginx ๊ตฌ์„ฑ ํŒŒ์ผ์—์„œ /static/admin/ ๋ธ”๋ก์„ ์ฃผ์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค( @gameot ๊ฐ€ ๋งํ–ˆ๋“ฏ์ด). ์ด์™€ ๊ฐ™์ด:

#location /static/admin/ {
#   alias /home/mohsen/virtualenvs/django-1.9/lib/python3.4/site-packages/django/contrib/admin/static/admin/;
#}

๋ฌผ๋ก  ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! grappelli๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๊ทธ๋ƒฅ ์“ธ๋ชจ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ทธ ํ›„ grappelli ๋ฌธ์„œ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด collectstatic์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. python manage.py collectstatic
๊ทธ๋Ÿฐ ๋‹ค์Œ nginx๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜์‹ญ์‹œ์˜ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰

๊ด€๋ จ ๋ฌธ์ œ

FrozenAlex picture FrozenAlex  ยท  15์ฝ”๋ฉ˜ํŠธ

adamchainz picture adamchainz  ยท  24์ฝ”๋ฉ˜ํŠธ

bob-r picture bob-r  ยท  9์ฝ”๋ฉ˜ํŠธ

asfaltboy picture asfaltboy  ยท  11์ฝ”๋ฉ˜ํŠธ

johncpang picture johncpang  ยท  4์ฝ”๋ฉ˜ํŠธ