DjangoのMTVデザインパターン(モデル・ビュー・テンプレート)
Model : Database に格納してあるデータ、および付随する処理(models.Model より提供)
Template : テンプレートファイルによってデザインされた各ページのデザイン
View : リクエストがあった URI ごとに、どのページを見せるかを記述する処理。
プロジェクト作成の流れ
-
$ django-admin startproject projectnamme
でプロジェクト作成 -
$ python manage.py migrate
でDB構築 -
$ python manage.py runserver
でとりあえず動作確認 -
$ ./manage.py startapp appname
でアプリケーションを追加する. - appname/models.py にそのアプリで使用するモデル(データベースのテーブル)を記述する.
- project/settings.pyに作成したアプリを追加する
- データベース更新
- appname/views.py にモデルの表示や操作(追加,編集など)を記述する. 使用するhtmlもここで用意.
- appname/urls.py を記述し,urlとviewsを紐付ける
- project/urls.pyからappname/urls.pyを読み込む.
基本的な開発の流れ
models.pyでDBの構造を決める
template作る(見た目)
urls.pyにファイルパス追加
静的ファイルはstatic内
views.pyでDBからデータを取り出して他のtemplateをrender
or templateからのpostをDBにデータ書き込み
Djangoのインストール
仮想環境の作成と起動
$ mkdir djangogirls
$ cd djangogirls
$ python3 -m venv myvenv
$ source myvenv/bin/activate
pipのupdate
(myvenv) ~$ python3 -m pip install --upgrade pip
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で使用されるパターンのリストが含まれています。
私たちが変更しない他のファイルを今は無視しましょう。 覚えておくべき唯一の事は、間違えてそれらを削除しないことです!
設定変更
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のセットアップ
(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
起動
(myvenv) ~/djangogirls$ python manage.py runserver
ブラウザで
http://127.0.0.1:8000/
ブログの作成
Djangoモデル
オブジェクトが何か分かったので、ブログポストのDjangoモデルを作りましょう。
Djangoのモデルは特別なオブジェクトで、データベース に格納されます。 データベースはデータの集まりです。 ここにユーザーやブログポストの情報を格納します。 データを格納するのにSQLiteデータベースを使います。 これはDjangoのデフォルトのデータベースで、今はこれで十分です。
データベースの中のモデルは、列(フィールド)と行(データ)があるスプレッドシートと思ってもらっても結構です。
(myvenv) ~/djangogirls$ python manage.py startapp blog
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog',
]
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に知らせましょう。
(myvenv) ~/djangogirls$ python manage.py makemigrations blog
Migrations for 'blog':
blog/migrations/0001_initial.py:
- Create model Post
DBに追加
python manage.py migrate blog
Django admin
今作成したポストを追加、編集、削除するのにDjango adminを使います。
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/ とアドレスバーにタイプします。
ログインするには、superuser (サイトの全てを管理するユーザー)を作る必要があります。
(myvenv) ~/djangogirls$ python manage.py createsuperuser
Username: admin
Email address: admin@admin.com
Password:
Password (again):
Superuser created successfully.
ブラウザに戻ってsuperuserでログインすると、Django admin ダッシュボード
PythonAnywhereとgitを使ったデプロイ
DjangoのDB接続
(myvenv) ~/djangogirls$ python manage.py shell
サーバー上の静的ファイルの更新
$ 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/