Django予約サイト作成時のエラー記録

attribute-error

前回のallauthに引き続き、今回はカレンダーと予約機能を作成しました。エラーにも慣れてきて、「このエラーが来たら、ここ」という間違い探しポイントを覚えていきたい。

最初のつまづきポイント

The QuerySet value for an exact lookup must be limited to one result using slicing.

ゼロ [0] が、、、、抜けていた。。。ので、追加したらうまく表示できた。

カレンダーに設定したはずの「〇印」や「ハイフン(-)」が表示されない。。。

=>最初にチェックしたのは、font-awesome のリンク設定とアイコンの記述ミス。ここは間違えていなかった。

font-awesome のリンクはコチラでゲット

=>55行目のfor文、「items」が「iems」になっていた。。。スペルミスが多すぎる。。。修正後は、きちんと表示された。

NoReverseMatch at が出たので修正

Reverse for 'teacher' not found. 'teacher' is not a valid view function or pattern name.

<原因>自分でつけた'name'を忘れて、違う'name'を呼び出していた。。。
app/views.py では ‘teacher’を呼び出していたが、app/urls.py では ‘staff’ という名前をつけていた。。とほほ。。。
app/urls.py の pathで、「teacher」のpathの名前を「staff」にしていたのをすっかり忘れていた。。。ややこしい名づけはNG。

修正前:return redirect(‘teacher’)

修正後:return redirect(‘staff’) で無事に表示できた。

追記:よく考えたら予約完了画面に遷移させたいので、結局「’thanks’(予約完了画面)」を呼び出した

AttributeError: ‘Booking’ object has no attribute…

初心者によくあるスペルミス。今回は、models.py の Booking で間違い発見!

エラーメッセージ別対策がよくまとまっているサイトを見つけたのでキープ:こちら

エラーメッセージをしっかり読むと「Booking」に「first_name」がない、と言ってるので、「Booking」クラスを設定したmodels.pyに直行すればすぐに見つかるが、初心者の私は、あのエラーの黄色い画面が怖くて挙動不審になってしまいがち(笑)。

寄り道:「make_aware」とは

naiveとaware(タイムゾーン有無)

同じdatetimeオブジェクトでも、タイムゾーンが付いているものと付いていないものがあります。

Pythonでは、タイムゾーンが付いているdatetimeaware(な日時)、付いていないdatetimenaive(な日時)と呼びます。

引用:Python 日付・時刻ライブラリー 逆引きリファレンス – Qiita

モデル(データベース)にnaiveまたはawareのどちらを使うかを設定しておかないと、時間系がエラーになるようだ。

The problem is not in Django settings, but in the date passed to the model. Here’s how a timezone-aware object looks like:

(問題はdjango settingsではなく、モデルに渡されるdateだ。awareにする場合は以下の通り)

>>> from django.utils import timezone

>>> import pytz

>>> timezone.now()

datetime.datetime(2013, 11, 20, 20, 8, 7, 127325, tzinfo=pytz.UTC)

And here’s a naive object:(naiveだとこうなる)

>>> from datetime import datetime

>>> datetime.now()

datetime.datetime(2013, 11, 20, 20, 9, 26, 423063)

stackflowのリンクはコチラ

寄り道2:timedeltaとは

pythonをしっかり勉強せず、初心者のくせにDjangoを始めてしまったので、つまづきポイントが多い(笑)。views.pyで出てきた「timedelta」という言葉が気になったので調べてみる

日付・時間の詳細はコチラ

The timedelta is a class in datetime module that represents duration. The delta means average of difference and so the duration expresses the difference between two datedatetime or time instances.

timedeltaは、期間を表すdatetimeモジュールのクラスです。 デルタは差の平均を意味するため、期間は2つの日付、日時、または時刻のインスタンス間の差を表します。

class datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)

The default value of all arguments is zero and all are optional. => すべての引数のデフォルト値はゼロであり、すべてがオプションです。

iQueryAZ

今回の予約システムでも頻発する「timedelta」。日付や時間の開始位置や初期値などを指定したい時に使ってるみたい。もうちょっと勉強しよう。。。

おすすめ記事