Effectivedjango.comã®Djangoã«é¢ããèšäºã®ç¿»èš³ã玹ä»ããŸãã ãã®ãã¬ãŒã ã¯ãŒã¯ãå匷ããŠãããšãã«ãã®ãµã€ãã«åºäŒããŸããã ãã®ãªãœãŒã¹ã«æçš¿ãããæ
å ±ã¯åœ¹ã«ç«ã€ããã«æããŸãããããã·ã¢èªãžã®ç¿»èš³ãã©ãã«ãèŠã€ãããªãã£ãããããã®åè¡ãèªåã§è¡ãããšã«ããŸããã ãã®äžé£ã®èšäºã¯ãDjangoãåŠç¿ããããã®æåã®ã¹ãããã®ã¿ãè¡ãWebéçºè
ã«ãšã£ãŠåœ¹ç«ã€ãšæããŸãã
ç®æ¬¡
- ã¯ããã«
- 广çãªDjangoã ã¬ã€ã
- Djangoã§ã®ãã¹ã
- ããã«ãŠã§ã¢ã«ã€ããŠ
- ããŒã¿ããŒã¹ãšã¢ãã«
- ã¯ã©ã¹ãã¥ãŒïŒCBVïŒ
- ãã©ãŒã
ã¯ããã«â§
Djangoã¯äººæ°ã®ãã匷åãªPythonãã¬ãŒã ã¯ãŒã¯ã§ãã å€ãã®ã
ããããªãŒ ããããã
ããã«éçºãéå§ã§ããŸãã ãã ãããã®ãã¯ãŒã¯ãã¹ãŠãåäœããããã«èŠããåºæ¬ã³ãŒããäœæã§ããããšãæå³ããŸãã ã§ã¯ãEffective Djangoã®æå³ã¯äœã§ããïŒ Effective Djangoãšã¯ãèšè¿°ãããã³ãŒãã
æ¥ç¶ãã ã
ãã¹ãå¯èœã§
ã¹ã±ãŒã©ãã«ãªæ¹æ³ã§Djangoã䜿çšããããšãæå³ããŸãã ãããã®åèªã¯ããããäœãæå³ããŸããïŒ
ã
æ¥ç¶ããããã³ãŒããšã¯ã1ã€ã®ããšã ããå®è¡ããããšã«çŠç¹ãåœãŠãã³ãŒãã§ãã ããã¯ã颿°ãŸãã¯ã¡ãœãããäœæãããšãã«ãäœæããã³ãŒãã1ã€ã®ããšãå®è¡ããé©åã«å®è¡ããå¿
èŠãããããšãæå³ããŸãã
ããã¯ã
ãã¹ãå¯èœãªã³ãŒãã®äœæã«çŽæ¥é¢ä¿ã
ãŸã ãå€ãã®ããšãè¡ãã³ãŒãã¯ããã¹ãããã®ãé£ããããããšããããããŸãã ãããŠããã®ã³ãŒãã¯è€éãããŠãã¹ããæžãããšãã§ããŸãã-åªåããã ãã®äŸ¡å€ã¯ãããŸããã-ããã¯åçŽåã«æ»ã£ãŠçŠç¹ãåœãŠãåå³ã§ãã
ãã¹ããããã³ãŒãã¯ããã®ããã®ãã¹ããç°¡åã«æžãããšãã§ãããããªã³ãŒãã§ãã åé¡ãèŠã€ããããã³ãŒãã
æåŸã«ã
ã¹ã±ãŒã©ãã«ãªã³ãŒããèšè¿°ã
ãŸã ã ããã¯ãå®è¡ãšãã芳ç¹ã§ã¹ã±ãŒãªã³ã°ããã ãã§ãªããããŒã ãšããŒã ã®çè§£ãšãã芳ç¹ã§å¢å€§ãããããšãæå³ããŸãã ååã«ãã¹ããããã¢ããªã±ãŒã·ã§ã³ã¯ãä»ã®äººãçè§£ããããïŒãŸãã倿ŽããããïŒãæ°ãããšã³ãžãã¢ã远å ããŠã¢ããªã±ãŒã·ã§ã³ãæ¹åããçµ¶å¥œã®æ©äŒãæå³ããŸãã
ç§ã®ç®æšã¯ããããã®ååã®éèŠæ§ãããªãã«çŽåŸãããããã«åŸã£ãŠãããå
ç¢ãªDjangoã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããæ¹æ³ã®äŸãæäŸããããšã§ãã é£çµ¡å
管çã¢ããªã±ãŒã·ã§ã³ã®æ§ç¯ããã»ã¹ãçµãŠã䜿çšãããœãªã¥ãŒã·ã§ã³ãšãã¹ãæŠç¥ã«ã€ããŠèª¬æããŸãã
ãããã®ææžã¯ãPyCon 2012ãPyOhio 2012ãPyCon 2013ãããã³
Eventbrite Webéçºçšã«äœæãããã¡ã¢ãšäŸã®çµã¿åããã§ãã ç§ã¯ãŸã ãããã1ã€ã®ããã¥ã¡ã³ãã«ãŸãšããäœæ¥ãè¡ã£ãŠããŸããããããã圹ç«ã€ããšãé¡ã£ãŠããŸãã
ãã®ãã¥ãŒããªã¢ã«ã®ãµã³ãã«ã³ãŒãã¯
githubã§å
¥æã§ããŸãã
nathan@yergler.netã«ãã£ãŒãããã¯ãææ¡ã質åãéä¿¡ã§ããŸãã
ãã®ããã¥ã¡ã³ãã¯ã
Webãµã€ãããã³
PDFããã³
EPub圢åŒã§
å
¥æã§ããŸã ã
ãã®ã¬ã€ãã®ãããªã¯ã
YouTubeã® PyConããèŠãããšãã§ã
ãŸã ã
第1ç« ã¯ããã«â§
1.1ã éçºç°å¢
éçºç°å¢ã«ã€ããŠè©±ããšããçæãã¹ã3ã€ã®éèŠãªäºå®ããããŸãïŒ
åé¢ ã
äºå®ãããã³
é¡äŒŒæ§ ã ãããã®ããããã¯éèŠã§ããããããã¯ãã¹ãŠå調ããŠäºãã«å¯Ÿè©±ããŸãã
åé¢ãšã¯ãç°å¢å€ã«ã€ã³ã¹ããŒã«ãããããŒã«ãããã±ãŒãžã誀ã£ãŠäœ¿çšã§ããªãããšãæå³ããŸãã ããã¯ãCã§èšè¿°ãããæ¡åŒµæ©èœãåããPythonããã±ãŒãžã«äŒŒããã®ã§ãããçºçããå Žåã«ç¹ã«éèŠã§ããã·ã¹ãã ã¬ãã«ã§ã€ã³ã¹ããŒã«ããããã®ã䜿çšãããããç¥ããªãå Žåãã³ãŒãããããã€ãŸãã¯é
åžãããšãæå³ãããšããã«æ©èœããŸããã
virtualenvã®ãããªããŒã«ã¯ãéé¢ãããç°å¢ã®ãããªãã®ãäœæããã®ã«åœ¹ç«ã¡ãŸãã
äŸåé¢ä¿ã®ã©ã®ããŒãžã§ã³ã«äŸåããŠãããã確å®ã§ãããã·ã¹ãã ç°å¢ã確å®ã«åçŸã§ããå Žåãç°å¢ã¯
äºåå®çŸ©ãããŠããŸãã
æåŸã«ãæ¬çªãŸãã¯éçºãµãŒããŒç°å¢ãšã®
é¡äŒŒæ§ã¯ãåããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãã©ãã«ã§ãã€ã³ã¹ããŒã«ããïŒããããåã
ãªãªãŒã¹ã§ã ïŒãåãããŒã«ã䜿çšããŠéçºç°å¢ãæ§æããæ¬çªç°å¢ãæ§æããããšãæå³ããŸãã ããã¯å¿
ãããå¿
èŠã§ã¯ãããŸããããå€§èŠæš¡ã§è€éãªãœãããŠã§ã¢ãæ§ç¯ããŠããå Žåããããã«ããµãŒããŒã§èŠããããã¹ãŠã®åé¡ãéçºç°å¢ã§åçŸå¯èœã§ããããšã確èªããããã«ãé¡äŒŒæ§ã圹ç«ã¡ãŸãã ãŸãã
é¡äŒŒæ§ ã«ããã³ãŒãã®ç¯å²
ãå¶éãããŸãã
1.1.1ã åé¢
- äžæãªäŸåé¢ä¿ãäžæãªããŒãžã§ã³ã®äœ¿çšãé¿ãããã
- virtualenvã¯ãã·ã¹ãã ãµã€ãããã±ãŒãžã䜿çšããã«ãããžã§ã¯ãã§äœæ¥ããç°¡åãªæ¹æ³ãæäŸããŸãã
1.1.2ã äºå®
- å®å
ã¯ãäŸåé¢ä¿ç®¡çãæå³ããŸãã
- ããŒã«ã®1ã€ãéžæããéçºäžãšãããã«ããµãŒããŒã®äž¡æ¹ã§äœ¿çšããŸãã
- äŸåé¢ä¿ã®æ£ç¢ºãªããŒãžã§ã³ã決å®ããŸãã
PyPIããã±ãŒãžããŒãžã§ã³ãŸãã¯ç¹å®ã®ãªããžã§ã³ïŒgitã®SHAãSubversionã®ãªããžã§ã³çªå·ãªã©ïŒã䜿çšããŠããŒãžã§ã³ãç¹å®ã§ããŸãã ããã«ããããã¹ãæã«äœ¿çšããã®ãšãŸã£ããåãããã±ãŒãžããŒãžã§ã³ãååŸã§ããŸãã
1.1.3ã é¡äŒŒæ§
- ã¢ããªã±ãŒã·ã§ã³ããããã€ããç°å¢ãšåæ§ã®ç°å¢ã§äœæ¥ããåé¡ã®æ€åºã詊ã¿ãŸãã
- 远å ã®ãµãŒãã¹ãå¿
èŠãšãããã®ãéçºããŠããå Žåãé¡äŒŒæ§ã¯ããã«éèŠã«ãªããŸãã
- Vagrantã¯ãæ¥åžžç°å¢ãšã¯å¥ã®ç°å¢ãç°¡åã«äœæã§ããä»®æ³ãã·ã³ç®¡çããŒã«ã§ãã
1.2ã ç°å¢ãã«ã¹ã¿ãã€ãºãã
1.2.1ã ããããªã¯ãŒã¯ã¹ããŒã¹ãäœæãã
翻蚳è
泚ïŒ
æåã«ãäœæ¥ãããã£ã¬ã¯ããªãäœæããŸãïŒ tutorial
ïŒïŒ
~$ mkdir tutorial ~$ cd tutorial ~/tutorial$ mkdir venv project
venv
ãã£ã¬ã¯ããªã«ã¯ä»®æ³ç°å¢ãå«ãŸãã project
ãã£ã¬ã¯ããªã«ã¯Djangoãããžã§ã¯ããå«ãŸããŸã
~/tutorial$ virtualenv --prompt="(venv:tutorial)" ./venv/ New python executable in ./venv/bin/python Installing setuptools............done. Installing pip...............done. ~/tutorial$ source ./venv/bin/activate (venv:tutorial)~/tutorial$
1.2.2ã äŸåé¢ä¿ãã¡ã€ã«ã®äœæ
tutorial
ãã£ã¬ã¯ããªã«ã1è¡ïŒäŸåé¢ä¿ïŒãå«ã
requirements.txt
ãã¡ã€ã«ãäœæã
requirements.txt
ã
Django==1.6.7
翻蚳è
泚ïŒ
Djangoã®ææ°ããŒãžã§ã³ïŒç¿»èš³ãæžããŠããæç¹ã§1.7ïŒã䜿çšããå ŽåDjango==1.6.7
ã®è¡ã®ä»£ããã«ã Django==1.6.7
å©çšå¯èœãªææ°ããŒãžã§ã³ãã€ã³ã¹ããŒã«ããŸãã
1.2.3ã äŸåé¢ä¿ã®ã€ã³ã¹ããŒã«
ãããŠã
pipã䜿çšããŠäŸåé¢ä¿ãã€ã³ã¹ããŒã«ã§ããŸãã
(venv:tutorial)~/tutorial$ pip install -U -r requirements.txt Downloadping/unpacking Django==1.6.7 (from -r requirements.txt (line 1)) Downloading Django-1.6.7.tar.gz (6.6MB): 6.6MB downloaded Running setup.py egg_info for package Django warning: no previously-included files matching '__pycache__' found under directory '*' warning: no previously-included files matching '*.py[co]' found under directory '*' Installing collected packages: Django Running setup.py install for Django changing mode of build/scripts-2.7/django-admin.py from 644 to 755 warning: no previously-included files matching '__pycache__' found under directory '*' warning: no previously-included files matching '*.py[co]' found under directory '*' changing mode of /home/nathan/p/edt/bin/django-admin.py to 755 Successfully installed Django Cleaning up...
1.3ã Djangoãããžã§ã¯ãã®éå§
建ç©ã建èšäžã®å Žåã建èšãå®äºããåã«æ§é ãç¶æããããã«è¶³å Žããã䜿çšãããŸãã è¶³å Žã¯äžæçãªãã®ã§ãã建ç©ã®åºç€ã®äžéšãšããŠæ©èœãããã®ã§ãããŸããŸããããããã«ãããããããéå§ããã°ããã®ãšãã«ã¯ããçšåºŠã®ãµããŒããæäŸããŸãã
Djangoã¯ãå€ãã®Webãã¬ãŒã ã¯ãŒã¯ãšåæ§ã«ãéçºçšã®
è¶³å ŽãæäŸããŸãã ããã¯ã決å®ãè¡ããã³ãŒãã®éå§ç¹ãæäŸããããšã§è¡ãããŸããããã«ãããHTTPãªã¯ãšã¹ãã®è§£ææ¹æ³ã§ã¯ãªãã解決ããããšããŠããåé¡ã«éäžããããšãã§ããŸãã Djangoã¯ãHTTPã§ã®äœæ¥ãšãã¡ã€ã«ã·ã¹ãã ã§ã®äœæ¥ã®äž¡æ¹ã«è¶³å ŽãæäŸããŸãã
HTTPè¶³å Žã¯ãããšãã°ãHTTPèŠæ±ãPythonèšèªãªããžã§ã¯ãã«å€æãããªã©ã®å¶åŸ¡ãè¡ãããµãŒããŒåŽã®å¿çãããç°¡åã«äœæããããã®ããŒã«ãæäŸããŸãã ãã¡ã€ã«ã·ã¹ãã ã®è¶³å Žã¯ç°ãªããŸããããã¯ãã³ãŒããæŽçããããã®äžé£ã®èŠåã§ãã ãšã³ãžãã¢ã¯ãã³ãŒããã©ã®ããã«ç·šæãããŠããããïŒä»®ã«ïŒãã§ã«çè§£ããŠããããããããã®èŠåã«ããããããžã§ã¯ãã«æ°ãããšã³ãžãã¢ãç°¡åã«è¿œå ã§ããŸãã Djangoã®èгç¹ããèŠããšã
ãããžã§ã¯ãã¯æçµè£œåã§ããã1ã€ä»¥äžã®
ã¢ããªã±ãŒã·ã§ã³ãããèªäœã®äžã«çµã¿åãããŸãã Django 1.4ã§ã¯ããããžã§ã¯ããšã¢ããªã±ãŒã·ã§ã³ããã£ã¹ã¯ã«é
眮ããæ¹æ³ã倿ŽãããããŸããŸãªãããžã§ã¯ãã§ã¢ããªã±ãŒã·ã§ã³ãç°¡åã«åæããã³åå©çšã§ããããã«ãªããŸããã
1.3.1ã ãããžã§ã¯ãäœæ
Djangoã¯ã
django-admin.py
ã¹ã¯ãªãããã·ã¹ãã ã«ã€ã³ã¹ããŒã«ããŠãscaffoldã¿ã¹ã¯ãåŠçããŸãã ãããžã§ã¯ããã¡ã€ã«ãäœæããã«ã¯ã
startproject
ã¿ã¹ã¯ã䜿çšããŸãã ãããžã§ã¯ãã®ååãšããããžã§ã¯ããé
眮ãããã£ã¬ã¯ããªã®ååãæ±ºå®ããŸãã ãã§ã«éé¢ãããç°å¢ã«ããã®ã§ã次ã®ããã«æžãããšãã§ããŸãã
翻蚳è
泚ïŒ
ãã£ã¬ã¯ããªã倿ŽããŸã~/tutorial/project/
ãããŠãå°æ¥ã¯ãã®ãã£ã¬ã¯ããªããã®ã¿åäœããŸãïŒ $
ã¯~/tutorial/project/$
ãæå³ããŸãïŒïŒ
(venv:tutorial)~/tutorial/$ cd project
(venv:tutorial)$ django-admin.py startproject addressbook .
äœæããããããžã§ã¯ãã®æ§é ã¯æ¬¡ã®ãšããã§ã
manage.py ./addressbook __init__.py settings.py urls.py wsgi.py
1.3.2ã ãããžã§ã¯ãã®è¶³å Ž
manage.py
- django-admin
ã¹ã¯ãªãããžã®ãªã³ã¯ã§ãããããããèšå®ãèªã¿åããå¿
èŠã«å¿ããŠç®¡çããããã«ããããžã§ã¯ããæãå®çŸ©æžã¿ã®ç°å¢å€æ°ã䜿çšããŸããsettings.py
ããã«ãããžã§ã¯ãã®èšå®ããããŸãã ãã¡ã€ã«ã«ã¯ãã§ã«ããã€ãã®é©åãªèšå®ãå«ãŸããŠããŸãããããŒã¿ããŒã¹ã¯æå®ãããŠããŸãããurls.py
ãããã³ã°ïŒè¡šç€ºïŒè¡šçŸçšã®URLãå«ãŸããŸããããã«ã€ããŠã¯åŸã®ç« ã§è©³çްã«èª¬æããŸããwsgi.py
ã¯ãã¢ããªã±ãŒã·ã§ã³ã®WSGI ã©ãããŒã§ãã ãã®ãã¡ã€ã«ã¯ãDjangoéçºãµãŒããŒãšãå Žåã«ãã£ãŠã¯ãæŠéããµãŒããŒäžã®mod_wsgi
ã uwsgi
ãªã©ã®ä»ã®ã³ã³ãããŒã«ãã£ãŠäœ¿çšãããŸãã
1.3.3ã ã¢ããªã±ãŒã·ã§ã³äœæ
(venv:tutorial)$ python ./manage.py startapp contacts
äœæãããã¢ããªã±ãŒã·ã§ã³ã®æ§é ã¯æ¬¡ã®ãšããã§ãã
./contacts __init__.py models.py tests.py views.py
- Django 1.4以éãã¢ããªã±ãŒã·ã§ã³ã¯ãããžã§ã¯ãããã±ãŒãžå
ã§ãã¹ããããŸãã ããã¯ãç¹ã«ãæŠéããµãŒããŒã«ãããžã§ã¯ããå±éãããšããæ¥ããšããã°ãããæ¹åã§ãã
models.py
ã¯ãã¢ããªã±ãŒã·ã§ã³ã®Django ORMã¢ãã«ãå«ãŸããŸããviews.py
ã«ã¯ããã¥ãŒã®ã³ãŒããå«ãŸããŸããtests.py
ã«ã¯ãäœæããåäœãã¹ããšçµ±åãã¹ããå«ãŸããŸãã- Django 1.7ïŒ
admin.py
ã«ã¯ç®¡çã€ã³ã¿ãŒãã§ãŒã¹ã®ã¢ãã«ãå«ãŸããŸãã - Django 1.7ïŒ
migrations/
ç§»è¡ãã¡ã€ã«ãå«ã
翻蚳è
泚ïŒ
çŸåšã ~/tutorial/
ãã£ã¬ã¯ããªã«ã¯ãäŸåé¢ä¿ãã¡ã€ã«ïŒ requirements.txt
ïŒãä»®æ³ç°å¢ã®ãã£ã¬ã¯ããªïŒ venv/
ïŒã1ã€ã®ãããžã§ã¯ãïŒ project/addressbook
ïŒã1ã€ã®ã¢ããªã±ãŒã·ã§ã³ïŒ project/contacts
ïŒãå«ãŸããŠãããæ¬¡ã®å
容ãå«ãŸããŠããŸãïŒ
~/tutorial/ requirements.txt venv/ ... project/ manage.py addressbook/ __init__.py settings.py urls.py wsgi.py contacts/ __init__.py models.py tests.py views.py
第2ç« ã¢ãã«ã®äœ¿çšâ§
2.1ã ããŒã¿ããŒã¹æ§æ
Djangoã¯ãããã«äœ¿çšã§ããMySQLãPostgreSQLãSQLite3ãããã³OracleããµããŒãããŠããŸãã
SQLite3ã¯ããŒãžã§ã³2.5以éãPythonã®äžéšã§ããããããããžã§ã¯ãã§äœ¿çšããŸãïŒç°¡åã«ããããïŒã ããšãã°ãMySQLã䜿çšããå Žåã¯ã
mysql-pythonã
requirements.txt
ã«è¿œå ããå¿
èŠããã
requirements.txt
ã
SQLiteãããŒã¿ããŒã¹ãšããŠäœ¿çšããã«ã¯ã
addressbook/settings.py
ãã¡ã€ã«ã®
DATABASES
å®çŸ©ãç·šéããŸãã settings.pyãã¡ã€ã«ã«ã¯ããããžã§ã¯ãã®Djangoèšå®ãå«ãŸããŠããŸãã æå®ããå¿
èŠãããããã€ãã®èšå®ïŒããšãã°ã
DATABASES
ãšããã®ä»ã®ãªãã·ã§ã³èšå®ããããŸãã Djangoã¯ããããžã§ã¯ããçæãããšãã«ããã€ãã®èšå®ãèªåçã«èšå®ããŸãã ããã¥ã¡ã³ãã«ã¯ã
èšå®ã®å®å
šãªãªã¹ããå«ãŸããŠã
ãŸã ã ããã«ãå¿
èŠã«å¿ããŠç¬èªã®èšå®ã远å ã§ããŸãã
SQLiteã䜿çšããã«ã¯ããšã³ãžã³ïŒ
ENGINE
ïŒãšããŒã¿ããŒã¹åïŒ
NAME
ïŒãæå®ããå¿
èŠããããŸãã SQLiteã¯ãããŒã¿ããŒã¹åãããŒã¿ããŒã¹ã®ãã¡ã€ã«åãšããŠè§£éããŸãã
DATABASES = { 'defaults': { 'ENGINE': 'django.db.backends.sqlite3,'
ããŒã¿ããŒã¹ãšã³ãžã³ã¯ãPythonãªããžã§ã¯ããžã®çŽæ¥åç
§ã§ã¯ãªããæååã§ç€ºãããããšã«æ³šæããŠãã ããã ããã¯
ããµãŒãããŒãã£ã®åœ±é¿ãåŒãèµ·ãããã«èšå®ãã¡ã€ã«ãç°¡åã«ã€ã³ããŒã
ããå¿
èŠãããããã§ãã ãã®ãã¡ã€ã«ã«ã¯ã€ã³ããŒãåŒã³åºãã远å ããªãã§ãã ããã
èšå®ãã¡ã€ã«ãçŽæ¥ã€ã³ããŒãããå¿
èŠã¯ã»ãšãã©ãããŸãããDjangoãèšå®ãã¡ã€ã«ãã€ã³ããŒãããèšå®ã
django.conf.settings
ãšããŠå©çšå¯èœã«ããŸãã éåžžã
django.conf
ããèšå®ãã€ã³ããŒãããŸãã
from django.conf import settings
2.2ã ã¢ãã«äœæ
Djangoã¢ãã«ã¯ïŒå€§ãŸãã«ïŒããŒã¿ããŒã¹ããŒãã«ã衚瀺ããããžãã¹ããžãã¯ãã«ãã»ã«åããå ŽæãæäŸããŸãã ãã¹ãŠã®ã¢ãã«ã¯ãåºæ¬ã¯ã©ã¹
Modelã®åå«ã§ãããå®çŸ©ãã£ãŒã«ããå«ãŸããŠããŸãã
contacts/models.py
ã¢ããªã±ãŒã·ã§ã³ã®ç°¡åãª
Contacts
ã¢ãã«ãäœæããŸãããïŒ
from django.db import models class Contact(models.Model): first_name = models.CharField( max_length=255, ) last_name = models.CharField( max_length=255, ) email = models.EmailField() def __str__(self): return ' '.join([ self.first_name, self.last_name, ])
Djangoã¯ãããŒã¿åãšããŸããŸãªæ€èšŒã«ãŒã«ã衚瀺ãããã
ã®ãã£ãŒã«ãã»ãããæäŸããŸãã ããšãã°ã䜿çšãã
EmailField
ã¯
CharField
åã®åãžã®ãããã³ã°ã§ãããããŒã¿æ€èšŒã远å ããŸãã
ã¢ãã«ãäœæããããããŒã¿ããŒã¹ã«æ°ããããŒãã«ã远å ããå¿
èŠããããŸãã Django
syncdb
ã¯ãã€ã³ã¹ããŒã«ãããã¢ãã«ã調ã¹ãŠãå¿
èŠã«å¿ããŠãããã®ããŒãã«ãäœæããŸãã
翻蚳è
泚ïŒ
Djangoã¯ç®¡çè
ã®ã¹ãŒããŒãŠãŒã¶ãŒãäœæããããšãææ¡ããŸããããã¯ããã©ã«ãã§ãã®ããŒãžã§ã³ã«å«ãŸããŠããŸãã 圌ã®ç³ãåºãå©çšããŠãã ããã
翻蚳è
泚ïŒ
Django 1.7以éããã€ãã£ãç§»è¡ãµããŒãããã¬ãŒã ã¯ãŒã¯ã«è¿œå ããã syncdb
廿¢ãããŸããã ãã®ããã syncdb
代ããã«migrate
syncdb
ã䜿çšããããã«èŠªåã«ããŠãã ããã
(venv:tutorial)$ python ./manage.py syncdb Creating tables ... Creating table django_admin_log Creating table auth_permission Creating table auth_group_permissions Creating table auth_group Creating table auth_user_groups Creating table auth_user_user_permissions Creating table auth_user Creating table django_content_type Creating table django_session You just installed Django's auth system, which means you don't have any superusers defined. Would you like to create one now? (yes/no): yes Username (leave blank to use 'bjakushka'): Email address: Password: Password (again): Superuser created successfully. Installing custom SQL ... installing indexes ... Installed 0 object(s) from 0 fixture(s) (venv:tutorial)$
翻蚳è
泚ïŒ
DjangoããŒãžã§ã³1.7以éã䜿çšããå Žåãåºåã¯æ¬¡ã®ããã«ãªããŸãã
(venv:tutorial)$ python ./manage.py migrate Opperation to perform: Apply all migrations: admin, contenttypes, auth, sessions Running migrations: Applying contenttypes.0001_initial... OK Applying auth.0001_initial... OK Applying admin.0001_initial... OK Applying sessions.0001_initial... OK (venv:tutorial)$
ãã ããé£çµ¡å
衚ã¯ã©ãã«ããããŸããã ãã®çç±ã¯ãã¢ããªã±ãŒã·ã§ã³ã䜿çšãããããããžã§ã¯ãã«äŒããå¿
èŠãããããã§ãã
INSTALLED_APPS
èšå®ã«ã¯ããããžã§ã¯ãã§äœ¿çšãããã¢ããªã±ãŒã·ã§ã³ã®ãªã¹ããå«ãŸããŠããŸãã ãã®ãªã¹ãã«ã¯ãPythonããã±ãŒãžã衚瀺ããæååãå«ãŸããŠããŸãã Djangoã¯ãæå®ãããåããã±ãŒãžãã€ã³ããŒããã
models
ã¢ãžã¥ãŒã«ãç£èŠããŸãã
contacts
ã¢ããªã±ãŒã·ã§ã³ããããžã§ã¯ãèšå®ïŒ
addressbook/settings.py
ïŒã«è¿œå ããŸãããïŒ
INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'contacts', )
ãã®åŸã
syncdb
å床å®è¡ã
syncdb
ã
翻蚳è
泚ïŒ
DjangoããŒãžã§ã³1.7以éã§ã¯ãäœæãããç§»è¡ãé©çšããããã«ã makemigrations
ã³ãã³ããå®è¡ããã¢ãã«ã®å€æŽã«åºã¥ããŠç§»è¡ãäœæãã makemigrations
ã³ãã³ããå®è¡ããå¿
èŠããããŸãã
(venv:tutorial)$ python ./manage.py syncdb Creating tables ... Creating table contacts_contact Installing custom SQL ... Installing indexes ... Installed 0 object(s) from 0 fixture(s) (venv:tutorial)$
翻蚳è
泚ïŒ
Django 1.7以éã®åºåïŒ
(venv:tutorial)$ python ./manage.py makemigrations Migrations for 'contacts': 0001_initial.py: - Create model Contact (venv:tutorial)$ python ./manage.py migrate Opperation to perform: Apply all migrations: admin, contenttypes, sessions, auth, contacts Running migrations: Applying contacts.0001_initial... OK (venv:tutorial)$
Djangoã¯
contacts_contact
ãšããããŒãã«ãäœæããããšã«æ³šæããŠãã ãããããã©ã«ãã§ã¯ãDj angoã¯ã¢ããªã±ãŒã·ã§ã³åãšã¢ãã«åã®çµã¿åããã䜿çšããŠããŒãã«åãäžããŸãã ããã¯ã
ã¡ã¿ã¢ãã«ãªãã·ã§ã³ã§å€æŽã§ããŸãã
2.3ã ã¢ãã«ã®çžäºäœçš
ã¢ãã«ãããŒã¿ããŒã¹ãšåæãããã®ã§ã察話åã·ã§ã«ã䜿çšããŠã¢ãã«ãšå¯Ÿè©±ã§ããŸãã
(venv:tutorial)$ python ./manage.py shell Python 2.7.3 (default, Mar 14 2014, 11:57:14) [GCC 4.7.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. (InteractiveConsole) >>> from contacts.models import Contact >>> Contact.objects.all() [] >>> Contact.objects.create(first_name='Nathan', last_name='Yergler') <Contact: Nathan Yergler> >>> Contact.objects.all() [<Contact: Nathan Yergler>] >>> nathan = Contact.objects.get(first_name='Nathan') >>> nathan <Contact: Nathan Yergler> >>> print nathan Nathan Yergler >>> nathan.id 1
ããã§ã¯ããã€ãã®æ°ããããŒã¹ã䜿çšãããŸããã ãŸãã
manage.py shell
ã³ãã³ãã¯ãDjangoã®æ£ãããã¹ã䜿çšããŠã€ã³ã¿ã©ã¯ãã£ããªPython
manage.py shell
ãèµ·åããŸãã Pythonã€ã³ã¿ãŒããªã¿ãŒãèµ·åããŠã¢ããªã±ãŒã·ã§ã³ãã€ã³ããŒãããããšãããšã䜿çšããèšå®ãDjangoã«ãããããã¢ãã«ã€ã³ã¹ã¿ã³ã¹ãããŒã¿ããŒã¹ã«ãããã§ããªããããäŸå€ãã¹ããŒãããŸãã
次ã«ãã¢ãã«ã®
objects
ããããã£ãããã§äœ¿çšãããŸããã ããã¯
ã¢ãã«ãããŒãžã£ãŒã§ãã ãã®ãããã¢ãã«ã®1ã€ã®ã€ã³ã¹ã¿ã³ã¹ãããŒã¿ããŒã¹å
ã®è¡ã®ã¢ãããžãŒã§ããå Žåãã¢ãã«ãããŒãžã£ãŒã¯ããŒãã«ã®ã¢ãããžãŒã§ãã ããã©ã«ãã§ã¯ãã¢ãã«ãããŒãžã£ãŒã¯ã¯ãšãªæ©èœãæäŸããã«ã¹ã¿ãã€ãºã§ããŸãã
all()
ã
filter()
ãŸãã¯ãããŒãžã£ãŒèªäœãåŒã³åºããšã
QuerySet
ãªããžã§ã¯ããè¿ãããŸãã
QuerySet
ã¯å埩å¯èœãªãªããžã§ã¯ãã§ãããå¿
èŠã«å¿ããŠããŒã¿ããŒã¹ããããŒã¿ãããŒãããŸãã
ãããŠæåŸã®-äžèšã§ã¯ã
id
ãšãããã£ãŒã«ãã䜿çšããŸããããããã¯ã¢ãã«ã§ã¯å®çŸ©ããŠããŸããã Djangoã¯ããã®ãã£ãŒã«ããã¢ãã«ã®äž»ããŒãšããŠè¿œå ããŸãããã©ã®ãã£ãŒã«ãã
äž»ããŒã«ãªãããèªåã§æ±ºå®ããŠããªãå Žåã®ã¿ã§ãã
2.4ã ãã¹ããæžã
ãã®ã¢ãã«ã§ã¯
__str__
1ã€ã®ã¡ãœãããå®çŸ©ããŠããã®ã§ããã¹ããäœæããŸãã
__str__
ã¡ãœããã¯ããå°æ°ã®å Žæã§ã®ã¿äœ¿çšããã
å¯èœæ§ãšããŠã¯ãšã³ããŠãŒã¶ãŒã«å®å
šã«è¡šç€ºãããŸã ã
ãã®æ¹æ³ã®ãã¹ããæžã䟡å€ã¯ãããŸããããã®ä»çµã¿ãçè§£ããŠããŸãã Djangoã¯ã¢ããªã±ãŒã·ã§ã³ãäœæãããšãã«
tests.py
ãã¡ã€ã«ãäœæããããããã®ãã¡ã€ã«ã«æåã®ãã¹ãã§ãã
contacts
ã¢ããªã±ãŒã·ã§ã³ã远å ããŸãã
from django.test import TestCase from contacts.models import Contact class ContactTests(TestCase): """Contact model tests.""" def test_str(self): contact = Contact(first_name='John', last_name='Smith') self.assertEquals( str(contact), 'John Smith', )
manage.py test
ã³ãã³ãã䜿çšããŠãã¢ããªã±ãŒã·ã§ã³ã®ãã¹ããå®è¡ã§ããŸãã
(venv:tutorial)$ python ./manage.py test
ãããå®è¡ãããšãçŽ420ã®ãã¹ããå®äºããããšãããããŸãã 1ã€ããæžããŠããªãã®ã§ãããã¯é©ãã¹ãããšã§ãã ããã¯ãããã©ã«ãã§ãã€ã³ã¹ããŒã«ãããŠãããã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ã«å¯ŸããŠDjangoããã¹ããå®è¡ããããã«çºçããŸããã
contacts
ã¢ããªã±ãŒã·ã§ã³ããããžã§ã¯ãã«è¿œå ãããšãããã©ã«ãã§ããã€ãã®Djangoçµã¿èŸŒã¿ã¢ããªã±ãŒã·ã§ã³ã远å ãããŠããããšãããããŸãã ããããããã«419ã®ãã¹ããè¡ââãããŸããã
翻蚳è
泚ïŒ
ç§ãã¡ã®å ŽåïŒDjangoããŒãžã§ã³1.6.7ã䜿çšããŠããå ŽåïŒãåã®æ®µèœã¯ããæä»£é
ãã§ãïŒå®è¡ãããã¹ãã¯1ã€ã ãã§ã-äœæãããã®ã§ãã ã³ãã³ãã®åºåã¯æ¬¡ã®ããã«ãªããŸãã
ç¹å®ã®ã¢ããªã±ãŒã·ã§ã³ã«å¯ŸããŠãã¹ããå®è¡ããå Žå-ã³ãã³ãã§ã¢ããªã±ãŒã·ã§ã³ã®ååãæå®ããŸãã
(venv:tutorial)$ python manage.py test contacts Creating test database for alias 'default'... . ---------------------------------------------------------------------- Ran 1 tests in 0.001s OK Destroying test database for alias 'default'... (venv:tutorial)$
次ã«é²ãåã«æ³šæãã¹ããã1ã€ã®è峿·±ãç¹ã¯ãåºåã®æåãšæåŸã®è¡ã§ãã
Destroying test database
Creating test database
Destroying test database
ã§ãã äžéšã®ãã¹ãã§ã¯ããŒã¿ããŒã¹ãžã®ã¢ã¯ã»ã¹ãå¿
èŠã§ãããã¹ãããŒã¿ããå®éã®ããã®ãšå¹²æžãããããªãïŒããŸããŸãªçç±ã§ãå°ãªããšãäºå決å®ã§ã¯ãããŸããïŒãããDjangoã¯ãã¹ããå®è¡ããåã«ãã¹ãããŒã¿ããŒã¹ãäœæããŠãããŸãã åºæ¬çã«ãæ°ããããŒã¿ããŒã¹ãäœæããããã®åŸã
syncdb
éå§ãããŸãã ãã¹ãã¯ã©ã¹ã
TestCase
ã¯ã©ã¹ã®äžäœã¯ã©ã¹ã§ããå ŽåïŒç§ãã¡ã®ãã®ãšåæ§ïŒãDjangoã¯åãã¹ãã®å®è¡åŸã«ããŒã¿ãããã©ã«ãå€ã«ãªã»ããããããããã¹ãã®1ã€ã®å€æŽãä»ã®ãã¹ãã«åœ±é¿ãäžããŸããã
2.5ã ãŸãšã
- ã¢ãã«ã¯ããŒãã«å
ã®ãã£ãŒã«ããå®çŸ©ããããžãã¹ããžãã¯ãå«ã¿ãŸãã
syncdb
ã¯ãã¢ãã«ããããŒã¿ããŒã¹ã«ããŒãã«ãäœæããŸãã DjangoããŒãžã§ã³1.7以éã§ã¯ã syncdb
代ããã«ãæåã«makemigrations
ã³ãã³ãã䜿çšããŠç§»è¡ãäœæããæ¬¡ã«migrate
ã³ãã³ãã䜿çšããŠããŒã¿ããŒã¹ã«å€æŽãå ããå¿
èŠããããŸãã- ã¢ãã«ãããŒãžã£ãŒã䜿çšãããšãã€ã³ã¹ã¿ã³ã¹ã®ã³ã¬ã¯ã·ã§ã³ïŒã¯ãšãªãäœæãªã©ïŒãåŠçã§ããŸãã
- ã¢ãã«ã«è¿œå ããã¡ãœããã®åäœãã¹ããäœæããŸãã
test
å¶åŸ¡ã³ãã³ãã¯ãå®è¡ããåäœãã¹ããå®è¡ããŸãã
翻蚳è
泚ïŒ
ãŸã 空ã®ã¢ããªã±ãŒã·ã§ã³ããã¹ãããã«ã¯ã次ã®ã³ãã³ããå®è¡ããå¿
èŠããããŸãã
(venv:tutorial)$ python ./manage.py runserver 0.0.0.0:8080
ããã«ãããçµã¿èŸŒã¿ãµãŒããŒãèµ·åãããã®æ©èœã¯Djangoãã芪åã«æäŸãããŸãã runserver
åŸã®ãã©ã¡ãŒã¿ãŒã«ã¯ãå®è¡äžã®ãµãŒããŒããªãã¹ã³ããip-addressãšportãæå®ãããŠããŸãã ãã®å ŽåããµãŒããŒã¯ããŒã8080ã«ã¢ã¯ã»ã¹ãããšãã«ãã¹ãŠã®IPã¢ãã¬ã¹ããã®èŠæ±ãåãå
¥ããŸãã
ç§ã¯ãå
éšIPã192.168.1.51ã®ããŒã ãµãŒããŒãéçºã«äœ¿çšããŠããŸãã ãããã£ãŠããã©ãŠã¶ã§éçºãµãŒããŒã®çµæã確èªããã«ã¯ãã¢ãã¬ã¹http://192.168.1.51:8080/ã«ã¢ã¯ã»ã¹ããŸã ã ãµãŒããŒã®ã¢ãã¬ã¹ã眮ãæããå¿
èŠããããŸãã
æ®ãã®ç« ã®ç¿»èš³ãç¶ããå¿
èŠããããšæããŸããïŒ ç¿»èš³ã¯åœ¹ã«ç«ã¡ãŸãããïŒ
ã³ã¡ã³ãã§å»ºèšçãªæ¹å€ãã§ããã°ããããã§ãã
翻蚳ã®èª€ããäžæ£ç¢ºãã«ã€ããŠã¯ãå人çãªã¡ãã»ãŒãžã§ãç¥ãããã ããã
æçš¿ã®åé ã§äœ¿çšãããç»åã¯ããŠãŒã¶ãŒMaGIc2laNTernã® ç»åã®ããªãšãŒã·ã§ã³ãšããŠäœæãããŸãã