LoginSignup
0
2

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-07-17

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

ブログの作成

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

ログインするには、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

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/

参考URL

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2