python django girlで入門(インストールから)

#DjangoのMTVデザインパターン(モデル・ビュー・テンプレート)
Model : Database に格納してあるデータ、および付随する処理(models.Model より提供) 
Template : テンプレートファイルによってデザインされた各ページのデザイン 
View : リクエストがあった URI ごとに、どのページを見せるかを記述する処理。

##プロジェクト作成の流れ
1. ```$ django-admin startproject projectnamme```　でプロジェクト作成
2. ```$ python manage.py migrate``` でDB構築
3. ```$ python manage.py runserver``` でとりあえず動作確認
4. ```$ ./manage.py startapp appname```  でアプリケーションを追加する．
5. appname/models.py にそのアプリで使用するモデル（データベースのテーブル）を記述する．
6. project/settings.pyに作成したアプリを追加する
7. データベース更新
8. appname/views.py にモデルの表示や操作（追加，編集など）を記述する．
使用するhtmlもここで用意．
9. appname/urls.py を記述し，urlとviewsを紐付ける
10. project/urls.pyからappname/urls.pyを読み込む．

##基本的な開発の流れ
models.pyでDBの構造を決める
template作る（見た目）
urls.pyにファイルパス追加
静的ファイルはstatic内
views.pyでDBからデータを取り出して他のtemplateをrender
or templateからのpostをDBにデータ書き込み

#Djangoのインストール
##仮想環境の作成と起動
```:command-line
$ mkdir djangogirls
$ cd djangogirls
$ python3 -m venv myvenv
$ source myvenv/bin/activate
```
##pipのupdate
```:command-line
(myvenv) ~$ python3 -m pip install --upgrade pip
```
##requirements.txtの作成
```
djangogirls
└───requirements.txt
```
djangogirls/requirements.txt ファイル中に以下のテキストを追加

```:djangogirls/requirements.txt
Django~=2.0.6
```
Djangoのインストール

```
(myvenv) ~$ pip install -r requirements.txt
Collecting Django~=2.0.6 (from -r requirements.txt (line 1))
  Downloading Django-2.0.6-py3-none-any.whl (7.1MB)
Installing collected packages: Django
Successfully installed Django-2.0.6
```

##プロジェクトの作成

```
(myvenv) ~/djangogirls$ django-admin startproject mysite .

(myvenv) ~/djangogirls$ tree
djangogirls
├───manage.py
├───mysite
│        settings.py
│        urls.py
│        wsgi.py
│        __init__.py
└───requirements.txt
```
manage.py:サイトの管理に役立つスクリプトです。 それを使用して、他のものをインストールすることなく、私たちのコンピュータ上でWebサーバーを起動することができます。

settings.pyファイルには、ウェブサイトの設定が含まれています。

手紙を送付する場所を確認する郵便業者について話した事を覚えていますか？ urls.pyファイルには、urlresolverで使用されるパターンのリストが含まれています。

私たちが変更しない他のファイルを今は無視しましょう。 覚えておくべき唯一の事は、間違えてそれらを削除しないことです！

##設定変更
```mysite/settings.py
TIME_ZONE = 'Asia/Tokyo'
LANGUAGE_CODE = 'ja'
#静的ファイルのパス
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
#ホストの追加(defaultは['localhost', '127.0.0.1', '[::1]'])
ALLOWED_HOSTS = ['127.0.0.1', '.pythonanywhere.com']
```

##DBのセットアップ
```:command-line
(myvenv) ~/djangogirls$ python manage.py migrate
Operations to perform:
  Apply all migrations: auth, admin, contenttypes, sessions
Running migrations:
  Rendering model states... DONE
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying sessions.0001_initial... OK
```
##起動
```:command-line
(myvenv) ~/djangogirls$ python manage.py runserver
ブラウザで
http://127.0.0.1:8000/
```
![install_worked.png](https://qiita-image-store.s3.amazonaws.com/0/181094/0cc10ff3-b76b-6aa0-b04f-44e514f25c9b.png)

#ブログの作成
##Djangoモデル

オブジェクトが何か分かったので、ブログポストのDjangoモデルを作りましょう。

Djangoのモデルは特別なオブジェクトで、データベース に格納されます。 データベースはデータの集まりです。 ここにユーザーやブログポストの情報を格納します。 データを格納するのにSQLiteデータベースを使います。 これはDjangoのデフォルトのデータベースで、今はこれで十分です。

データベースの中のモデルは、列（フィールド）と行（データ）があるスプレッドシートと思ってもらっても結構です。


```(myvenv) ~/djangogirls$ python manage.py startapp blog```

```mysite/settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog',
]
```

```blog/models.py
from django.db import models
from django.utils import timezone


class Post(models.Model):
    author = models.ForeignKey('auth.User', on_delete=models.CASCADE)
    title = models.CharField(max_length=200)
    text = models.TextField()
    created_date = models.DateTimeField(
            default=timezone.now)
    published_date = models.DateTimeField(
            blank=True, null=True)

    def publish(self):
        self.published_date = timezone.now()
        self.save()

    def __str__(self):
        return self.title
```

##データベースにモデルのためのテーブルを作成する
最後のステップは新しいモデルをデータベースに追加することです。 まず、モデルに少し変更があったこと（今作ったこと）をDjangoに知らせましょう。

```:command-line
(myvenv) ~/djangogirls$ python manage.py makemigrations blog
Migrations for 'blog':
  blog/migrations/0001_initial.py:

  - Create model Post
```

DBに追加

```:command-line
python manage.py migrate blog
```

#Django admin

今作成したポストを追加、編集、削除するのにDjango adminを使います。

blog/admin.pyファイルをエディタで開いて、内容をこのように変えて下さい：

```blog/admin.py
from django.contrib import admin
from .models import Post

admin.site.register(Post)
```

前回定義したPostモデルをimportしています。 
Web サーバーを実行するコンソールで ```python manage.py runserver``` を実行してください。 ブラウザに行って http://127.0.0.1:8000/admin/ とアドレスバーにタイプします。
![login_page2.png](https://qiita-image-store.s3.amazonaws.com/0/181094/601c3795-53c9-d06e-57e9-2ceafd2be2a4.png)
 
ログインするには、superuser （サイトの全てを管理するユーザー）を作る必要があります。

```
(myvenv) ~/djangogirls$ python manage.py createsuperuser
Username: admin
Email address: admin@admin.com
Password:
Password (again):
Superuser created successfully.

```

ブラウザに戻ってsuperuserでログインすると、Django admin ダッシュボード
![django_admin3.png](https://qiita-image-store.s3.amazonaws.com/0/181094/a08a439d-04d3-e48e-52ab-beee93b02a63.png)

#PythonAnywhereとgitを使ったデプロイ
https://tutorial.djangogirls.org/ja/deploy/

#DjangoのDB接続
```
(myvenv) ~/djangogirls$ python manage.py shell
```
https://tutorial.djangogirls.org/ja/django_orm/

#サーバー上の静的ファイルの更新
```
$ workon <your-pythonanywhere-username>.pythonanywhere.com
(ola.pythonanywhere.com)$ python manage.py collectstatic
[...]
```

#モデル作成からマイグレーションスクリプト実行までの流れ

モデル作成(各アプリのmodels.py)
↓
プロジェクトにアプリケーション読み込み(mysiteのsettings.pyのINSTALLED_APP)
↓
モデルを元にマイグレーションスクリプトを作成(makemigrations)
↓
マイグレーションスクリプトを実行(migrate)


#DB変更時の反映(model or DBの種類)
```
$ python manage.py makemigrations blog
$ python manage.py migrate blog
```

## DBの操作
```
$ python manage.py shell
>>> from blog.models import Post
データ全表示
>>> Post.objects.all()
<QuerySet [<Post: my post title>, <Post: another post title>]>

ユーザ一覧
>>> from django.contrib.auth.models import User
>>> User.objects.all()
<QuerySet [<User: ola>]>
>>> me = User.objects.get(username='ola')

新しいPostを作成
>>> Post.objects.create(author=me, title='Sample title', text='Test')
オブジェクトの抽出
>>> Post.objects.filter(author=me)
>>> Post.objects.filter(title__contains='title')
>>> from django.utils import timezone
>>> Post.objects.filter(published_date__lte=timezone.now())
>>> post = Post.objects.get(title="Sample title")
>>> post.publish()
並び替え
>>> Post.objects.order_by('created_date')
逆順
>>> Post.objects.order_by('-created_date')
クエリセットをつなげる
>>> Post.objects.filter(published_date__lte=timezone.now()).order_by('published_date')
```

##pkはプライマリーキー！
テーブルのデータの登録順に1.2.3...で登録されている
https://tutorial.djangogirls.org/ja/extend_your_application/

#参考URL

https://tutorial.djangogirls.org/ja/django_installation/