Django～ことはじめ～

本サイトはdjango初心者がdjangoの公式ドキュメントをベースにして、学習した内容をまとめたものです。
djangoには公式サイトのチュートリアルが用意されています。体系的な理解を得るなら、チュートリアルを進めて、そこに記載されている投票アプリケーションを作成してみるのが一番早いかと思います。
[チュートリアル](https://docs.djangoproject.com/ja/1.11/intro/tutorial01/)
また、チュートリアル以外に個人的に参考になると思われるサイトもいくつかピックアップしておきます。
[Django Best Practiceへの道](http://akirachiku.com/2014/04/01/road-to-django-best-practice.html)
[Djangoでの開発ダイジェスト](https://qiita.com/zaburo/items/0e15f6c150caa13ca34c)
[Djangoにおけるクラスベース汎用ビューの入門と使い方サンプル](https://qiita.com/felyce/items/7d0187485cad4418c073)
[DjangoによるWebアプリケーション開発入門](https://eiry.bitbucket.io/index.html)

**django-構成**
> プロジェクトフォルダ名
>>プロジェクトフォルダ名
>>>\_\_init\_\_.py
settings.py
urls.py
wsgi.py

>>アプリケーション名
migrationsフォルダ(migrate実行時に作成されます)
templatesフォルダ(djangoのtemplateシステムを使う際に作成します)
>>>\_\_init\_\_.py
admin.py
apps.py
forms.py
models.py
ursls.py(アプリケーション名配下のurls.pyは自動では作成されません。必要に応じて手動で作成します)
views.py

***
**models.py**
役割：
>(django公式ドキュメントより) 
・各モデルは Python のクラスで、 django.db.models.Model のサブ クラスです。
・モデルの各アトリビュートの値は、データベース上のあるフィールドを表現 します。
・モデルの情報をもとに、 Django はデータベース API を自動生成します。 API の詳細は「 クエリを生成する 」で解説します。

[公式ドキュメント(models.py)](http://docs.djangoproject.jp/en/latest/topics/db/models.html)

<モデルの概要>
・データベースのテーブル名やカラム名、カラムのプロパティ値などの情報を設定します。
・複数のテーブルに共通するカラムがあるときは、抽象ベースクラスという仕組みを利用することにより、モデル内の個々のクラスに重複するテーブルを設定する手間を省けます

*models.pyファイルに記載するコードの記述例

```python:models.py
#クラス名はdbのテーブル名に対応させた名称を記述するとわかりやすいです
 class XXX(xxxModel)
#クラス名と同様、各フィールド名には、dbのcolumn名に対応させた名称を記述するとよいです
#クラス内の各プロパティ値にdbのデータ型(int, charなど)を指定する他、ブラウザ画面上でデフォルトで表示される値を設定します。
#formに渡す場合は、入力を必須にするかどうかなどの情報も記述できます。
   column_name1 = models.CharField(max_length = xx)
   column_name2 = models.IntegerField()

```

```python:models.py
#抽象ベースクラスには複数テーブルで共通して使うテーブルを設定します
 class XXX(models.Model)
   common_column_name1 = models.CharField(max_length = xx)
   common_column_name2 = models.IntegerField()

#抽象ベースクラスを定義する際に、ベースクラスを定義するため、Metaというクラスを用意し、abstract = Trueを入れます。
    class Meta:
       abstract = True;
```

***
**forms.py**
役割：
>(django公式ドキュメントより)
・フォームウィジェットから、 HTML フォームを自動的に生成して表示できます。
・提出されたデータに対して、バリデーション規則 (validation rule) を適用できま す。
・バリデーションエラーを検出したときに、フォームをエラーメッセージ付きで表示で きます。
・提出されたデータを、適切な Python のデータ型に変換できます。

[公式ドキュメント(forms.py)](http://docs.djangoproject.jp/en/latest/topics/forms/)

<フォームの概要>
・ブラウザ上で表示されるフォームフィールドを設定します。
・フォームを表示すると、各フィールドの値を入力するためのフォームコントロールタグが出力されます
・ブラウザ上からの入力データを検証(validate)することも可能です
・フォームコントロールをブラウザ上に表示→ブラウザ上でのユーザーの入力処理によってpostまたはgetデータ形式で入力データを受信→処理に応じて結果を返すという手順で処理を進めます。


*forms.pyファイルに記載するコードの記述例(ModelFormを継承した場合)

```python:forms.py
class xxxForm(forms.Modelform):
   model = ModelName1
   fields = ['field_name1', 'field_name2',]
   labels = {
      'field_name1': 'field_label1',
      'field_name2': 'field_label2',
   }
```
・model : models.pyで定義したクラス名を記述(DBのテーブル名に対応)
・fields ：models.pyで定義したもののうち、modelで定義したクラスの各要素からhtml側で参照したいものを選択して記述(DBのcolumn名に対応)
・labels ：fieldsの各値を説明するラベルを記述。labelに記述した値もhtml側で参照される



***
**views.py**
役割：
>(django公式ドキュメントより) 
・djangoの汎用ビュー
・別のページへリダイレクトし、与えられたテンプレートをレンダリングするような、 よくある簡単なタスクの処理。
・リストと単一オブジェクトの詳細ページを表示。カンファレンスを管理するアプリケー ションを作っているなら、 TalkListView と RegisteredUserListView に リストビューを、単一の発表に関するページに詳細ビューが使えます。
・日付ベースのオブジェクトを年/月/日のアーカイブで表示。詳細と最新ページで 関連付けて表示します。 Django のブログ の年月日ごとのアーカ イブはこれで作られています。
認証あり、または無しでユーザにオブジェクトを生成、更新、削除を許可。

[公式ドキュメント(views.py)](http://docs.djangoproject.jp/en/latest/topics/http/views.html)

<ビューの概要>
・呼び出し元からリクエストを受信→リクエストを処理→レスポンスを生成→呼び出し元に返すという手順で処理を進めます。
・引数にdjangoで予め用意されているListView, DetailViewなどをviews.py内で作成するクラスの引数にすることにより、ブラウザ画面上での表示形式を設定できます(ListViewなら表形式など)

*views.pyファイルに記載するコードの記述例

```python:views.py
class xxxForm(forms.Modelform):
   model = ModelName1
   fields = ['field_name1', 'field_name2',]
   labels = {
      'field_name1': 'field_label1',
      'field_name2': 'field_label2',
   }
```
・model : models.pyで定義したクラス名を記述(DBのテーブル名に対応)
・fields ：models.pyで定義したもののうち、modelで定義したクラスの各要素からhtml側で参照したいものを選択して記述(DBのcolumn名に対応)
・labels ：fieldsの各値を説明するラベルを記述。labelに記述した値もhtml側で参照される

***
とりあえず動かしてみる
*本サイトではwindows環境での作業を例として記載します。mac環境、linux環境の場合は適宜、読み替えてください。

最初に適当な作業用フォルダを作成し、venv環境を作ります。下記の例ではPyCharmProjects配下にtestフォルダを作成して、作業環境を作ってます。

```コマンドプロンプト.
> cd "C:\PycharmProjects\test"
> python -m venv venv
```

venv環境を起動させ、test1というプロジェクトを作ります

```コマンドプロンプト.
> venv\Scripts\Activate
(venv)> django-admin.py startproject test1
```

開発サーバーを起動させてみます

```コマンドプロンプト.
(venv)> cd test1
(venv)> python manage.py runserver
```

起動に成功すると、下記のメッセージが表示されます。

```コマンドプロンプト.
Performing system checks...

System check identified no issues (0 silenced).

You have unapplied migrations; your app may not work properly until they are applied.
Run 'python manage.py migrate' to apply them.

May 02, 2015 - 03:42:51
Django version 1.8, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
```

ブラウザ上でhttp://127.0.0.1:8000
を参照すると、djangoのwelcome画面が表示されます。

***
今後も気になったこと、覚えたことなどを都度都度、追記していきます。