Python Django チュートリアルのチュートリアル


[Python Django チュートリアル](http://qiita.com/maisuto/items/d01e2cca63c8e5b2c18c)のチュートリアルです．

[django](http://djangoproject.jp/)フレームワークを通じてpythonの勉強をし，
ついでにwebアプリ作成ができるようになることを目指します．

→ [チュートリアルまとめ](http://qiita.com/maisuto/items/17653f344d1f64afa019)

>なんかこの記事書いてる途中に公式っぽいチュートリアル，説明ページを見つけちゃいましたが，
気にせずに車輪の再開発をして行こうと思います．
http://eiry.bitbucket.org/tutorial/index.html


このページではpython環境の作り方やチュートリアルの進め方を説明していきます．

と，思いましたがpython環境の作り方については既に素敵なドキュメントがありましたので
その紹介と補足を行います．

windowsの方 → http://eiry.bitbucket.org/win/tutorial/installation.html
macの方 → http://eiry.bitbucket.org/mac/tutorial/installation.html

> ちなみに私の環境は以下の通りです．
>> OS：Mac OSX10.11
python：3.4.2
django：1.8.5

上記のページにpython3.4系等のインストール，virtualenvのインストールの説明がありますが，
これに加えて`virtualenvwrapper`もインストールしておくことをおすすめします．
>`wrapper`の名の通り，virtualenvが若干使いやすくなります．
>> ```bash
$ mkdir -p ~/PycharmProjects/practice  # 仮想環境用のディレクトリ用意
$ cd ~/PycharmProjects/practice/  # 用意したディレクトリに移動
$ virtualenv --python="`which python3.4`" virtualenv  # 仮想環境の作成
$ source virtualenv/bin/activate  # 有効化
```
> という一連の操作がvirtualenvwrapperを使うと

>> ```bash
$ mkvirtualenv practice  # 仮想環境作成
$ workon practive  # 有効化．（mkvirtualenvの後は実行する必要がない）
```

> これだけでよくなります．
> pathを通したり環境変数を設定したり，若干手間はかかりますがやっといて損はないです．
>
> pathって何？って人はqiitaに素敵な記事があったので参考にどうぞ．
>「[PATHを通すとは？](http://qiita.com/soarflat/items/09be6ab9cd91d366bf71)」
「[PATHを通すために環境変数の設定を理解する (Mac OS X)](http://qiita.com/soarflat/items/d5015bec37f8a8254380)」



# ソースコードについて

チュートリアルのソースコードをgithubに置いています．
0からチュートリアルを眺めつつコードを書いていくのは大変なので是非活用してみてください．
>githubの置き場
https://github.com/usa-mimi/tutorial

コマンドラインでの使用でも大丈夫ですが慣れるまで大変なので
SourceTreeなどのGUIツールを使用することをおすすめします．

> こちらも使い方については何人かの方が書いてくれてるので紹介しときます．
[Source Treeの使い方](http://qiita.com/takamichi_tsutsumi/items/6358a74a62d4fc15d1a5)
[SourceTree 設定手順 覚書【Windows】](http://qiita.com/redamoon/items/5928ecab7e36f23b81ee)
[SourceTreeから始めるGit](http://qiita.com/icoxfog417/items/a650768dfc91b0f0df05)

SourceTreeの操作を少しだけ説明しておきます．

## githubからcloneしてくる
ソースコードの置き場所のことを`リポジトリ`といいます．
まず最初にすることは[github](https://github.com/usa-mimi/tutorial)上のリポジトリを
自分のPCに持ってくることです．
>この操作を「リモートのソースをローカルにcloneする」「リモートからローカルへcloneする」などと言います．

SourceTreeでは最初の画面で「URLからクローン」を選択してください．
>![スクリーンショット 2015-11-17 22.40.53.png](https://qiita-image-store.s3.amazonaws.com/0/58048/3e1196e4-2582-bfe2-c5ff-58889ab437ad.png "スクリーンショット 2015-11-17 22.40.53.png")


一度ブラウザで[github](https://github.com/usa-mimi/tutorial)のページを開いてclone用のURLをコピーして来てください．
画面の右側にリンクがあり，アイコンをクリックするとリンクがクリップボードにコピーされます．
\# 直接これをコピーしてもいいです → `https://github.com/usa-mimi/tutorial.git`

>![スクリーンショット 2015-11-17 22.43.11.png](https://qiita-image-store.s3.amazonaws.com/0/58048/19626b1c-fd58-8c03-d484-4c0bbfb1f711.png "スクリーンショット 2015-11-17 22.43.11.png")

再びSourceTreeの画面を開き，ソースURLに先ほどのURLをペーストし，
保存場所を選択してクローンボタンを押すとローカルにソースコードがクローンされます．
>![Kobito.t0Cg2q.png](https://qiita-image-store.s3.amazonaws.com/0/58048/f2758c14-101e-a098-57fb-e7504f0a35c5.png "Kobito.t0Cg2q.png")

## cloneして来たコードを動かしてみる

正常にclone出来ていれば，先ほどの保存場所に以下のような構成でファイルが展開されているはずです．

```
tutorial/  # gitでcloneした際にできるディレクトリ（SourceTreeで指定したディレクトリ）
    ├ .git/  # 隠しファイルなので設定によっては見えない
    ├ .gitignore  # 同上
    ├ ...
    └ tutorial/  # 説明は特に注釈がない限りここをrootとして説明します
          ├ manage.py  # djangoのコマンドを実行する時に指定する
          ├ requirements.txt  # pipでinstallすべきライブラリ一覧
          ├ db.sqlite3 #  migrateコマンドを実行すると作成されます．clone直後は存在しません．
          ├ ...
          └ tutorial/
                ├ ...
                ├ urls.py  # projectのURL
                └ settings.py  # projectの設定ファイル
```

### 必要なpythonライブラリのinstall
terminal（プロンプト）で適当な名前の仮想環境を作成し，2つ目の`tutorial` ディレクト
（manage.pyがあるディレクトリ）に移動し，以下のコマンドの実行してください．

```
(tutorial) $ pip install -r requirements.txt
```

ちなみに`requirements.txt`の中身は`$ pip freeze`コマンドの出力結果です．

### databaseの作成

migrateコマンドを実行してdbを作成してください．
`manage.py`と同じ階層に`db.sqlite3`というsqlite用のデータベースファイルが作成されます．

```
(tutorial) $ ./manage.py migrate
```

### 実行

以下のコマンドを実行した後でブラウザで http://localhost:8000 にアクセスすることで動作が確認できます．
\# この辺の内容はチュートリアルでも説明します．

```
(tutorial) $ ./manage.py runserver
```

## ソースコードを眺める
branchは`master`と`develop`の2つで進めています．
`master`ブランチのコミットはどこでチェックアウトしても `runserver` で動作が確認できます．
`develop`ブランチは編集内容を細かくコミットしているので場所によっては動かないことがあります．


![スクリーンショット 2015-11-17 23.25.43.png](https://qiita-image-store.s3.amazonaws.com/0/58048/85b9c904-1d99-2bef-2582-741c552df31f.png "スクリーンショット 2015-11-17 23.25.43.png")

①にはコミット一覧が表示されています．
左側に○の並びが2列ありますが，左側がmasterブランチ，右側がdevelopブランチです．

②はひとつ前のコミットからの変更ファイル一覧が表示されます．
> 「同じブランチの」ひとつ前のコミットとの差分です

>```
○ ┐ # 今ここのコミットにいる
│ ● # ここの差分ではない
│ ●
│ ●
│ ●
○ ┤ # こことの差分
│ ●
```

③は②で選択したファイルの変更内容です．
追加した行は緑色，削除した行は赤色で表示されます．

## ソースコードの切替

①の部分の適当な行をダブルクリックするとそこへ`HEAD`が移動します．
チュートリアルでは `ソース： 7f5128a→3efdc15` のようにどのコミット（タグ）から初めて
最終的にどのコミット（タグ）になったかを書いてます．

チュートリアルを途中から始めたい場合はこのハッシュ値（もしくはタグ）を参考にしてソースコードを切り替えてください．

切替後は `$ ./manage.py migrate` を忘れずに実行してください．
\# `db.sqlite3`ファイルを消した後に実行すると確実ですが，入力したデータが消えます．

ソースコードを試しに編集した後で元に戻したくなった場合，
ターミナルで `$ git reset --hard HEAD` と打つと元に戻ります．

>変更内容は全部消えます．
編集した内容を残したい場合は適当なブランチを切った上でコミットしてください．

# python2系統を使っている方へ

djangoはpython2でも3でも問題なく動作しますが，日本語を使用する際に少し面倒な記述が必要だったり，
文字列の取り扱い方の違いで書き方が変わったりしますので，できるだけpython3を使うようにしてください．

virtualenvで仮想環境を作成する時に使用するpythonを選択可能なので，その時にpython3を指定してあげるといいです．
例えば私のPCにはpython2と3の両方が入っており，`python`だけで実行するとpython2.7.9が使われます．
しかし，仮想環境を作成する時に`python3`を指定することで実行されるpythonのバージョンが変更されます．

```bash
$ python2 -V
Python 2.7.9

$ python3 -V
Python 3.4.2

$ python -V  # python を実行すると python2 が実行される
Python 2.7.9

$ mkvirtualenv tutorial -p python3  # python3を指定してtutorial環境を作成
...
(tutorial)$ python -V  # pythonを実行すると python3 が実行される
Python 3.4.2
```

## python2で文字コードエラーが出た場合の対応方法

```
$ ./manage.py 
... # スタックトレース
SyntaxError: Non-ASCII character '\xe8' in file .../tutorial/polls/models.py on line 6, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
```

実行した時にこんな感じのエラーが出たら文字コード関連のエラーです．

ファイル内で日本語を使用する場合はファイル先頭に以下の行を追加してください．
`# -*- coding: utf-8 -*-`

> windowsのメモ帳などでソースを書いている人は文字コードがshift-jisなので
`# -*- coding: sjis -*-`
と書いてください．

また，日本語文字を変数に代入したり引数で使用する際には，文字列がユニコードであることを示すために`u`を付けてください．

```python
s = '日本語文字`  # python3ではOK，python2だとエラーになる

s = u'日本語文字`  # OK

f(u'引数')  # 引数に渡す文字も同様
```
<hr>

→ [チュートリアルまとめ](http://qiita.com/maisuto/items/17653f344d1f64afa019)