the dawn of yuriko hisory

アニメやら漫画関係で何か作りたいものと勉強したことのメモ用

DjangoGirlsに挑戦~Django urlsってなに?~

Django urlsってなに?

今回デプロイは飛ばします。
実際に何か作る際に改めて調べる必要がありそう。

DjangoのURLはどのように動いているのか

プロジェクトフォルダ/urls.py

from django.conf.urls import include, url
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
]

前回の記事で大部分は説明したので飛ばしていきます。

今回はアプリケーションごとにURLの設定をしていきます。
まずはDjangoが起動したときに最初に読み込まれるのは
プロジェクトフォルダのurls.pyに設定されているため
そちらにアプリケーションのurls.pyを読み込ませるように設定する。

from django.conf.urls import include, url
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),

    url(r'', include('blog.urls')), //1
]

1
これはURLのパス部分が/ の時にblogアプリケーションのurlsを読み込むように設定している
ローカル環境で接続する場合はhttp://127.0.0.1:8000/にリクエストを送ったときに見てくれる用になる

これでアプリケーション用のURLの設定ができるようになるが、
Djangoのアプリケーションを追加した際にデフォルトでurls.pyは作成してくれていないため、(これはなんでだろう?)
作ってあげる必要がある

project/
├ manage.py
├ app/
│   ├ __init__.py
│   ├ settings.py
│   ├ urls.py
│   └ wsgi.py
└ blog/
     ├ migrations
     ├ _init_.py
     ├ admin.py
     ├ models.py
     ├ tests.py
     ├ views.py
     └ urls.py //ここに新規で追加

blog/urls.py

from django.conf.urls import include, url
from . import views //1

urlpatterns = [
    url(r'^$', views.post_list), //2
]

1.
同フォルダ内のviews.pyを読み込む
なぜ読み込んでいるのかは2で説明

2.
第二引数views.post_listの意味は
このURLにリクエストした時にviews.pyのpost_listを返すように設定している。
DjangoのURLのリクエストの順番として
プロジェクトのurls.py → アプリケーションのurls.py → 表示するようのview(MVCで言うController)に渡して
実際に画面の描写する処理を作成していく


これでとりあえずURLを作成していく流れができたので
次にビュー部分を実装していき、実際に画面に表示させていく。

DjangoGirlsに挑戦~ログインページを作ろう~

ログインページを作ろう

admin(管理ページ)

管理ページに行く前に設定することが二つ

まず一つ目、Visual Studio上でDjangoを作成しているせいなのかわからないが
urls.pyがコメントアウトされているのでadminページへのURLが設定されていません。
なので設定してあげる

プロジェクトのフォルダ/urls.py

from django.conf.urls import include, url //1
from django.contrib import admin //2

urlpatterns = [ //3
    url(r'^admin/', include(admin.site.urls)),  //4
]

1.
URL定義用のクラス
この辺りのクラスはいまいち理解できていない
興味がわいたらソースコードを見てみる

2.
今回作るadmin(管理)サイトのインタフェース
admin配下に管理サイト用のテンプレートやらビューやらが全部あるので
これ見るだけでもかなり勉強になりそう

3.
urlpatterns
関数でもなんでもないけどどこで読み込まれるのか
settings.pyのROOT_URLCONFに設定されてます。

4.
url()の引数の中にごにょごにょ書いていく
引数として(regex, view, kwargs=None, name=None)を受け取る

regexは、正規表現でURLの指定を行う
r'^admin/' これはしばらくは書き方だけ覚えちゃうのが良さそう
細かい設定とかする時になったら改めて覚えるってことで
とりあえずは r''でURLをくくる
^が始まりで/が終わり
つまりr'^admin/'は (URL省略)/adminにURL設定しますよー

viewは、そのままビュー!って思ったら間違い
DjangoはMTVモデルでModel-Template-Viewになっている
通常のMVCでいうとMは同じでDjangoのViewがContoroller、TemplateがMVCのViewにあたる
なのでurlの引数として渡すviewも実際はコントローラの関数に該当する
今回はinclude()でadmin内のurls.pyを見てそこから先はそっちで処理をするようになっている


一つ目がだいぶ長くなってしまったけど
二つ目の設定
今度は表示したいmodelのあるアプリケーションフォルダのadmin.pyを設定
DjangoGirlsだとblog/admin.pyになる そもそも一つ追加してないしね

from django.contrib import admin
from .models import Post //1

admin.site.register(Post) //2

1.
.を使うことで相対パス読み込みになる
.modelsは同ディレクトリ内のmodels.pyを読み込む宣言

2.
adminへの登録
第二引数にadminオブジェクトを作成してadminのオプション変更ができるみたい
使う機会あるかな

設定はこれで終わり
サーバを起動して、ローカルアドレスの後ろに/adminを入れてアクセスすると
https://i.gyazo.com/89d565ba0dec84a2e33ceaab711ff4bf.png

ログインするのにsuperuserを作成する。
Visual Studioなら(以下略)

Djangoの管理画面が優秀すぎてこれだけでおなか一杯になれるし、
ブログで公開する必要なければローカルで管理サイトだけ置いとけばいいんじゃないかなってぐらい
とりあえず作り終わったら今後のためにいくつかポストしておく

https://i.gyazo.com/309f7e3680dd3e937c690c7f2eeacdd5.png

gyazo.com

DjangoGirlsに挑戦~Djangoモデル~

Djangoモデル

DBは標準のsqlite3を使用

アプリケーションの作成

Visual StudioだとDjangoアプリの追加で簡単に作成できる
blogを作成

以下ディレクト

project/
├ manage.py
├ app/
│   ├ __init__.py
│   ├ settings.py
│   ├ urls.py
│   └ wsgi.py
└ blog/
     ├ migrations
     ├ _init_.py
     ├ admin.py
     ├ models.py
     ├ tests.py
     └ views.py

アプリケーション追加後はそれをDjangoで使用できるようsettings.pyを修正

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'blog', #追加
]

モデルの作成

blogアプリケーションからDBを操作するためのモデルを作成
Django girlsではブログを作成していくので
投稿する内容が入るPostモデルを作成

from django.db import models //1
from django.utils import timezone

class Post(models.Model): //2
    author = models.ForeignKey('auth.User') //3
    title = models.CharField(max_length=200) //4
    text = models.TextField() //5
    created_date = models.DateTimeField(default=timezone.now) //6
    published_date = models.DateTimeField(blank=True, null=True) //7

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

    def __str__(self): //9
        return self.title

1.
from 〇〇 import ××は
django.dbの中のmodelsメソッドだけを呼びますよーって宣言
普通にimport django.dbでも問題ないけどその場合

import django.db

class Post(django.db.models.Model):
    author = django.db.models.ForeignKey('auth.User')

とかってなって非常に面倒くさいのでfrom importを使って宣言することが多い

2.
class宣言したPostオブジェクトがモデルになる。
django.db.models.Modelを使用することで、Djangoのモデルとして扱う


3.
モデルに対してプロパティを定義
設定したものがそのままDBにも定義される
models.ForeignKey()は引数に渡したモデルへのリンク
('auth.User')はDjangoが元から作成しているUserクラスをリンクしていることになる
Userの追加方法は後ほどやることになる

4.
modelsCharField() 文字列を扱うmax_lengthは必須項目なので忘れるとmakemigration実行時にエラーが吐かれるので注意

5.
models.TextField() テキストを扱うがCharFieldと違って制限なしの長いテキストを取り扱う
ブログ記事などの文章を取り扱う際に使用することになる

6.
models.DateTimeFiled(default=timezone.now) 日付と時刻を扱う
同じようなものでDateFieldがあって混同するが
DateFieldはDatetime.dateインスタンスによって表示される
DateTimeFiledはDatetime.datetimeインスタンスによって表示される
つまりDateFieldは日付、DateTimeFiledは日付+時刻になる
ブログなどの書いた時刻がわかった方が良いコンテンツはDateTimeFiledを使用する
(default=timezone.now)はデフォルトの値にそのまま現在の時刻を突っ込んでいるだけ

7.
blank=True DB登録時に空白を許可
null=True DB登録時にnullを許可

8.
モデル内だけど関数
selfはクラスのインスタンス自身を表しているらしい

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

ざっくりとメソッドの動きはpublished_date(投稿日)を今の時間にセットして
save()でDBに登録してるんだなとわかる
実際にどう動いているかは登録処理時にわかるかな?

9.
__str__でクラスを文字列化している
JavaとかのtoString()をイメージするのがよさそう

テーブル作成

makemigrationとmigrate
VSならボタンポチポチで終了

DjangoGirlsに挑戦~プロジェクトを作成しよう~

プロジェクトを作成しよう

PythonフレームワークDjangoチュートリアル 学習したことのメモ

workshop_tutorialJP · GitBook

Djangoインストー

環境についてはVisual Studio2017を採用
IntelliJ IDEAもよいらしいが現状不便がないのでしばらくはVS2017を使っていこうと思う

Visual Studioの場合プロジェクト作成時に
Django 1.11.3
Python 3.6
の環境はすでに用意してくれるので特別な設定は必要なかった。

ディレクトリ構成
project/
 ├ manage.py
 └ app/
  ├ __init__.py
├ settings.py
├ urls.py
wsgi.py

とにかく触ることになるのは
settings.py: サイトの設定ファイル
urls.py: URLの設定

Django Girlsでも以下のように説明されているので、とにかく上の設定ファイルに関してどうなっているのかだけ今回は覚える

今は他のファイルについては無視しておきましょう。触ることはありません。間違って削除してしまわないようにさえしておけば大丈夫です!

最初の設定

settings.pyからプロジェクトの初期設定を行う

タイムゾーン
LANGUAGE_CODE = 'ja-JP' #これはする意味があるのかどうかがわからない

TIME_ZONE  'Asia/Tokyo' #タイムゾーンは住んでる場所に応じて設定しましょう

USE_TZ = false # Trueにすると複数のタイムゾーンが使えるけど、特別必要なければfalseにしておいた方が無難っぽい
データベース設定

Djangoは標準でsqlite3で設定されている
今回は特に変更する必要はないかなと

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # これでプロジェクトのディレクトリを取得

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3'
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}
データベース作成

migrateを実行しますが、Visual StudioならクリックしていくだけでOK

この辺りに関してわかりやすSlideがあったので参考に

現状の認識としては
DBと一対一になるModelを作成して、
変更したらmakemigrationsでマイグレーションファイルを作成
DBに反映させるためにmigrationで移動作業

実際に作成されたマイグレーションファイルを確認したりもできるけどチュートリアルでやるかな?

サーバを起動する

ここまで設定して初期設定が終わったので起動してみる(といってもプロジェクト作成してからいきなりサーバを立ち上げても動きます)

It worked!みたいな画面が出ればプロジェクトの作成は終了