てきとう

ワーワーゆうとります

DEBUG=Falseで見つかるエラーもあるよー

  • こんな現象が起きたので


前回の記事で「セレクト変更したらajaxでデータをひっぱってきて」っていう処理をやってたんですが
そいつらはdjangoで動いていまして。DEBUG=Trueで作業していた時はサクっといったのに
DEBUG=FalseにしたらInternal Server Errorが返ってくるようになってしまいました。
デバッグモードを切ると、余計なエラーが出ないように「サーバーエラーだよ!」って事にしてくれるんですね。

  • デバッグモードを切りつつ、エラーの内容を確認できたら、それはとっても素敵だなって


テンプレート側ではデバックさせたらいいじゃないか藤村君。という訳でsettings.pyのデバッグ定数を

DEBUG = False
TEMPLATE_DEBUG = True

という状態にして、テンプレートでのみエラーを確認できる状態に。
で、FireBugのコンソールで確認しながらajax処理してみたら、エラーを受け取っていました。
その受け取ったエラーに

DjangoUnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in
position 0: ordinal not in range(128). You passed in
( 'django.forms.forms.BoundField'>)

おおう…。


自分が長い間phpというぬるま湯に浸かりすぎていたせいであって、基本的に他の言語では型指定とかキッチリするスタンスなのは分かっています。
でも今はpythonの方が好きだよ。名前がかっこいいし。

このエラーが出る時は大概pyファイルにおまじないが足りない時なんかに出るそうで、ファイルの頭に

# -*- coding:utf-8 -*-

って入れたら解決する事が多いらしいです。早速pyファイルを確認。入ってる。じゃあなぜ。

  • 原因は痛恨の凡ミス


そもそもformのBoundFieldの所で出ている。今回modelFormを使っているので、modelを確認してみよう。

class Gohan(models.Model):
    CHOICE_OKAZU = (
        ('0', _(u'たまご')),
        ('1', _(u'のり')),
        ('2', _(u'しゃけ')),
        ('3', _('納豆')),
        ('4', _(u'ハム')),
    )
    okazu = models.CharField(_(u"好きなおかず"), blank=False, max_length=1, choices=CHOICE_OKAZU)

あっ、「納豆」の所にunicode指定のアレがない!
という訳で原因はこいつでした。DEBUG=Trueだとよきに計らってくれるのに、Falseだとダメなんですねー。