はじめてのDjango チュートリアル⑥-⑦

アプリ の構造をカスタマイズする

  • 静的ファイルを追加する
  • CSSや画像の追加

背景画像を追加する

admin フォームのカスタマイズ

  • 今まで作っていたPollsの質問に加えて、選ぶ項目を追加したりカラム以外の最近公開したメソッドを表示したりした
  • フィルターや検索など簡単に管理画面機能として追加した

プロジェクト テンプレートをカスタムする。

  • 管理画面も自由にカスタマイズすることができる

はじめてのDjango チュートリアルを終えて

qiita.com

  • 自分にとって良さそうな記事があったので読んで見る

はじめてのDjango チュートリアル④-⑤

docs.djangoproject.com

Write a minimal form

  • csrf_tokenを毎回書くのかな🤔
  • 必要なものはimportして使用する
  • POSTフォームを作成して、投票されたらページリダイレクトさせる
    • リダイレクト後にインクリメントでChoiceのvotesに数が足される

汎用ビューを使う: コードが少ないのはいいことだ

  • URLconf の修正
  • views の修正

docs.djangoproject.com

自動テストの導入

"Code without tests is broken by design." Django チュートリアルでテストを書けるなんて嬉しい限りである

  • 自動テストとは何ですか?
  • なぜテストを作成する必要があるのか
  • テストはあなたの時間を節約します
  • またテストは問題点を検出するのみならず、問題が発生するのを防ぐこともできます。
  • テストは、コードをより魅力的にします
  • テストを書くことはチームで共同作業を行う上で役に立ちます。

    バグを見つけたとき

  • 今作っているpollsアプリでバグを再現する
    • 未来に設定したものが最近のものとして作られることが可能な状態
$ python manage.py test polls

はじめてのDjango チュートリアル③

docs.djangoproject.com

オーバービュー

  • 投票アプリケーションでは、以下4つのビューを作成します:
    • 質問 "インデックス" ページ -- 最新の質問をいくつか表示(index)
    • 質問 "詳細" ページ -- 結果を表示せず、質問テキストと投票フォームを表示(show)
    • 質問 "結果" ページ -- 特定の質問の結果を表示(result)
    • 投票ページ -- 特定の質問の選択を投票として受付(new/create)
  • URLからビューを得るために、Django は「URLconf」を使用する

    もっとビューを書いてみる

  • polls/views(pollsのコントローラーにActionを追加)
  • urls(route)にどんなurlpatternがリクエストされたら、どのviewアクションを返すかを記載する
  • mysite.urls(mysite/urls.py)→ polls.urls

    実際に動作するビューを書く

  • テンプレート設定するのに冗長的なファイル構成だな😅

    ショートカット: render()

  • render() 関数は、第1引数として request オブジェクトを、第2引数としてテンプレート名を、第3引数(任意)として辞書を受け取る

    404 エラーの送出

docs.djangoproject.com

  • ショートカット: get_object_or_404()
    • リクエストのオブジェクトがあればそれを返し、なかれば404を表示する

      テンプレートシステムを使う

  • ドット検索
    • オブジェクト → 属性 → リスト

      テンプレート内のハードコードされたURLを削除

  • URL 名の名前空間
    • 便利

Django チュートリアルは読みにくい😂(翻訳が変だしすべて翻訳されているわけではない)

はじめてのDjango チュートリアル②

年末は、なかなか進められなかった

 

  • Dockerの業務に力を入れていた

  • 退職とかの引継ぎとか

 

また、マシーンをほぼ初期から動かすことになったので環境諸々の設定が最初からで億劫だった…

kindleとかでPythonの言語の勉強などはしていた

そして、年始からはインフルエンザに数年ぶりに罹って死にそうだった  

docs.djangoproject.com

データベースの設定

  • mysite/settings.pyでデータベース情報を記載するようだ
  • あらかじめ諸々入ってるみたい(不要なものは外してくれって書いてる)
django.contrib.admin - 管理(admin)サイト。まもなく使います
django.contrib.auth - 認証システム
django.contrib.contenttypes - コンテンツタイプフレームワーク
django.contrib.sessions - セッションフレームワーク
django.contrib.messages - メッセージフレームワーク
django.contrib.staticfiles - 静的ファイルの管理フレームワーク

postgresのinstall、起動とデータベース作成

  • sqlite3はあれなんでpostgresqlを使用することにした
  • 本番デプロイとかを視野にいれるとMySQLPostgreSQLが候補になるんじゃないだろうか
  • settingでdb情報変更
$ python manage.py migrate

modelの作成

投票アプリでは、質問と選択の2つのモデルを作成します。質問には、質問と発行日があります。選択肢には、選択肢のテキストと投票集計の2つのフィールドがあります。各選択肢は質問に関連付けられています。

  • polls/models.pyにモデル情報を記載していく
from django.db import models


class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')


class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)
  • ここでは、各モデルはdjango.db.models.Modelをサブクラス化するクラスによって表される。各モデルには多数のクラス変数があり、それぞれがモデル内のデータベースフィールドを表す。
  • ForeignKey を使用してリレーションをしているとのこと
    • リレーションする場合、on_deleteを設定する(CASCADE、PROTECT、SET_NULL、SET_DEFAULT、SET()、DO_NOTHING)

モデルを有効にする

  • mysite/settings.pyにモデル情報に追加する
$ python manage.py makemigrations polls

apiで遊んで見る

  • なるほどちょっとよく分からない

管理画面の作成

  • Djangoの最も良いところの一つなんじゃないだろうか

    管理ユーザ作成

$ python manage.py createsuperuser

はじめてのDjango チュートリアル①

docs.djangoproject.com 前回の続きからこちらを進める

チュートリアルの目標物

  • 投票アプリ
    • ユーザが投票したり結果を表示したりできる公開用サイト
    • 投票項目の追加、変更、削除を行うための管理 (admin) サイト

ユーザーテーブルや投票テーブルの作成やCRUD処理が学べるチュートリアルのようです!

$ python -m django --version
=> 3.0

プロジェクトの作成

$ django-admin startproject mysite
  • rails new 的なことをやっているはず…!
mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py
  • ここmysiteが2つ作成される(外側と内側って紛らわしい…)

開発サーバーを立ち上げてみる

$ python manage.py runserver

pollアプリケーションを追加

  • manage.pyがあるディレクトリで以下のコマンドを実行
  • django-app/mysite/polls/になると思うのだけど合っているのだろうか🤔
$ python manage.py startapp polls

はじめてのビューを作る

polls/views.py

from django.http import HttpResponse


def index(request):
    return HttpResponse("Hello, world. You're at the polls index.")
  • Ruby on Railsでいうところのcontrollerかな
    • Railsだとviewはtemplateにあたるかと思います

URLの設定

ビューを呼ぶために、 URL を対応付けしてやる必要があります。そのためには URLconf が必要です。

  • URLconf を作るには urls.pyファイルを作る polls/urls.py
from django.urls import path

from . import views

urlpatterns = [
    path('', views.index, name='index'),
]
  • mysite/urls.pyに…と書いているけど内側か外側か分からないぞ🤔 django-app/mysite/mysite/urls.pyに書くぞ?
from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path('polls/', include('polls.urls')),
    path('admin/', admin.site.urls),
]

include() 関数

  • ちょっと文章だけだと分からない😂

  • http://127.0.0.1:8000/polls/にアクセスすると urlマッチでviewのdef indexを読んでGET RequestでResponseとして文字列を返している

docs.djangoproject.com

path() 関数は4つの引数を受け取ります。引数のうち route と view の2つは必須で、kwargs、name の2つは省略可能

  • 引数: route [必須] route は URL パターンを含む文字列です。リクエストを処理するとき、Django は urlpatterns のはじめのパターンから開始し、リストを順に下に見ていきます。要求された URL を一致するものを見つけるまで各パターンと比較します。

パターンはGETやPOSTのパラメーター、そしてドメイン名を検索しません。例えば、 https://www.example.com/myapp/ へのリクエストにおいては、URLconfは myapp/ を見ます。 https://www.example.com/myapp/?page=3 へのリクエストにおいても、URLconfは myapp/ を見ます。

  • 引数: view [必須] Django がマッチする正規表現を見つけると、 Django は指定されたビュー関数を呼び出します。その際は HttpRequest オブジェクトを第一引数に、そしてキーワード引数としてrouteから「キャプチャされた」値を呼び出します。この例はこの後すぐ出てきます。

  • 引数: kwargs 任意のキーワード引数を辞書として対象のビューに渡せます。この機能はチュートリアルでは使いません。

  • 引数: name URL に名前付けをしておけば Django のどこからでも明確に参照でき、とくにテンプレートの中で有効です。この便利な機能のおかげで、プロジェクトのURLにグローバルな変更を加える場合にも1つのファイルを変更するだけで済むようになります。

  • path(route、view、kwargs = None、name = None)

  • path('polls/', include('polls.urls'))

    • route= 'polls/', view= include('polls.urls')
  • path('admin/', admin.site.urls)

    • route= 'admin/', view= admin.site.urls
  • path('', views.index, name='index')

    • route= '', views.index, name='index'

Django のリクエスト処理

docs.djangoproject.com

PythonとDjangoセットアップ

HomebrewでpythonをupdateしようとしてとりあえずHomebrewのupdateする

$ brew update

↓なんだろこれ。。

Error: undefined method `core_tap?' for nil:NilClass

ググってみると他の人でもなっているようだ。Githubのissueにも結構見かけた。

もう一度、brew update

Already up-to-date.

なんかあ成功してるっぽい?挙動が不安なので

$ brew doctor

Warningが4つほど出てきたけどErrorはない...

  • 最新バージョンになっているので様子を見て使用していこうと思う
brew -v
Homebrew 2.2.0
Homebrew/homebrew-core (git revision b15cb; last commit 2019-12-07)
Homebrew/homebrew-cask (git revision c95b0; last commit 2019-12-08)
brew config
HOMEBREW_VERSION: 2.2.0
ORIGIN: https://github.com/Homebrew/brew
HEAD: 7d7de295dfbc5e581106e2b1f674496b5e25a773
Last commit: 11 days ago
Core tap ORIGIN: https://github.com/Homebrew/homebrew-core
Core tap HEAD: b15cb7e117a2dee10a285a9f9eba6f8801a2d323
Core tap last commit: 21 hours ago
HOMEBREW_PREFIX: /usr/local
CPU: quad-core 64-bit kabylake
Homebrew Ruby: 2.6.3 => /usr/local/Homebrew/Library/Homebrew/vendor/portable-ruby/2.6.3/bin/ruby
Clang: 11.0 build 1100
Git: 2.21.0 => /Applications/Xcode.app/Contents/Developer/usr/bin/git
Curl: 7.64.1 => /usr/bin/curl
macOS: 10.15.1-x86_64
CLT: N/A
Xcode: 11.1

Djangoのインストール

pyenvをinstall

  • pythonmacに入っているけど新しいversionを入れる
  • Homebrewでパッケージ管理しているpyenvをinstall
brew install pyenv
  • pyenvってrbenvと同じようなパッケージ🤔
$ pyenv -v
pyenv 1.2.15
  • 中身を見てみる
$ pyenv install --list
.
.
3.8.0
3.8-dev
3.9-dev
anaconda2-2019.03
anaconda2-2019.07
anaconda3-2019.03
anaconda3-2019.07
anaconda3-2019.10
.
.
  • 結構更新が早い?pythonは2系3系でどうとか話を聞いてたけど4系もそろそろ?
  • anacondaも2と3があるのか🙄

bash_profileにpyenvの設定を追加

$ echo 'export PATH="$HOME/.pyenv/bin:$PATH"' >> ~/.zshrc
$ echo 'eval "$(pyenv init -)"' >>  ~/.zshrc
// bashの場合は ~/.bash_profileに書く
$ source ~/.zshrc
  • pyenvでversion指定する ※ globalが都合悪いならlocalで特定ファルダに設定する
$ pyenv global 3.8.0
$ python
Python 3.8.0

Django

$ pip install Django
$ python
Python 3.8.0
>>> import django
>>>
>>> print(django.get_version())
3.0

SafariのCSSハック

概要

  • iphoneipadでのSafariブラウザ
  • inputのtype="text"やtextareaなどがdisabledがtrueになっている文字列にcssのstyleのcolorを指定
  • Safariではdisabledが優先されていた

    iphoneipadSafariから開発モードでデバックして調査する

  • SafariのWebインスペクタをONにしてブラウザで iphoneipadの実機でCSSを調査する

    • Macなどのブラウザで疑似デバイスを使用しても結果が異なっているので実機を使用した
  • Safariのバージョン12.0.3でも以下の記事のように「開発」から表示がされなかった

Webインスペクタの使用方法はググったら以下のような記事が多くみられた blanche-toile.com

SafariCSSハック

  • 特定のデバイスにstyleを当てたい時はCSSハックなど指定が裏技的なものが存在する
    • バイスやバージョンによって記述が異なる
  • .css-hoge-selectorにセレクタやclassを指定する
// safariのみ適応させる
_::-webkit-full-page-media, _:future, :root .css-hoge-selector {

}

disabledのstyleを適応させる

  • 普通のcolorではなく-webkit-text-fill-colorを使用
  • -webkit-text-fill-colorにrgbaを使用していたが別途opacityを設定しないと反映されなかったので追加指定して対応した
_::-webkit-full-page-media,
_:future,
:root
input[type="text"]:disabled,
textarea:disabled {
  -webkit-text-fill-color: $color;
  opacity: 1;
}