๋ฐฉ๊ธ 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'
๊ทธ๋ฌ๋ ์ด๊ฒ์ ๊ณ ์น ๋ฐฉ๋ฒ์ ๋ชจ๋ฆ ๋๋ค.
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();
ํ์ด์ง ๋งค๊น ๋ง๋๊ฐ ์ด๋ฆฌ์ง ์๋ ํํฐ๋ก ๋ชฉ๋ก์ ๋งจ ์๋ก ์ด๋ํ์ต๋๋ค(์ฒจ๋ถ๋ ์ด๋ฏธ์ง ์ฐธ์กฐ).
์บ์๋ฅผ ์ง์๋ ๋์์ด ๋์ง ์์ต๋๋ค.
์ฌ์ฉ๋ 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๋ฅผ ๋ค์ ์์ํ์ญ์์ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋์๊ฒ ๋ฌธ์ ๋ ์ฌ์ ํ ์กด์ฌํฉ๋๋ค.
ํ์ด์ฌ 2.7, ์ฅ๊ณ 1.9.6, ๊ทธ๋ํ ๋ฆฌ 2.8.1