Python
Djnagogirls
on_delete
whitenoise

DjangoGirlsで生じたエラーまとめ

DjangoGirlsを進めていくなかで生じたエラー

djangoGirlsのチュートリアルをDjango Girls Tutorialを元に進めていく中で、仕様の変化などで生じたエラーをまとめてみた。自分のメモ用

環境

python:3.6.5
Django:2.1.1

参考元

Djangoのincludeの仕様が変っていてハマったのでメモ
Django2.0から必須になったon_deleteの使い方
DjangoアプリをHerokuにデプロイする時のエラー対処 whitenoise編

エラー1:on_delete

Django Girls TutorialのDjango modelsの項で、モデルの変更を伝えるために以下を実行すると、

(myvenv) ~/djangogirls$ python manage.py makemigrations blog
TypeError: __init__() missing 1 required positional argument: 'on_delete'

とエラーが、、、 調べてみるとDjangoはバージョン2以降から、blog/models.pyのForeignKeyの引数にon_deleteを渡さないといけないらしい。

解決策

訂正前

blog/models.py
 class Post(models.Model):
    author = models.ForeignKey('auth.User')

訂正後

blog/models.py
 class Post(models.Model):
    author = models.ForeignKey('auth.User',on_delete=models.CASCADE)

因数のところにon_delete=models.CASCADEと渡せばOK!

エラー2:whitenoiseの仕様変化に伴うエラー

デプロイの項の終盤で、

command line
(myvenv) ~/djangogirls$ python manage.py runserver

と入力すると

command line
ImportError: 
Your WhiteNoise configuration is incompatible with WhiteNoise v4.0
This can be fixed by following the upgrade instructions at:
http://whitenoise.evans.io/en/stable/changelog.html#v4-0

とかいうエラーが発生。色々調べたところ、Django Girls Tutorialを進めていると、

blog/wsgi.py
from whitenoise.django import DjangoWhiteNoise
application = DjangoWhiteNoise(application)

と記述するシーンありますが、Whitenoiseがアップデートされて、エラーを引き起こすとのこと。

解決策

blog/wsgi.py
from whitenoise.django import DjangoWhiteNoise
application = DjangoWhiteNoise(application)

上のコードをまず消去。そして、'mysite/setting.py'をいじります。
setting.pyのMIDDLEWAREの部分を

mysite/setting.py
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'whitenoise.middleware.WhiteNoiseMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

に変更。2行目に'whitenoise.middleware.WhiteNoiseMiddleware',を追加している。