[MongoDB]1.8→2.0から地理系Pointが厳密に値チェックされる

Posted under python by uechoco on 金曜日 13 1月 2012 at 14 : 48 : 21

MongoDBを使用したプログラムのサーバーが壊れてしまったので、
サーバーの再構築を手伝ったのですが、
aptitudeで入れたMongoDBから不思議なエラーが返ってきてた

point (35.1,136.2) must be in earth-like bounds of long : [-180, 180), lat : [-90, 90]

どうやらプログラムで緯度経度を逆転して取り扱っていたらしい。
以前はMongoDB 1.8で動いていたが、2.0になってからこのエラーが発生した。

MongoDBのgitのプログラムを見てみると、たしかにエラーチェック関数が2.0から追加されている。

@see https://github.com/mongodb/mongo/blob/master/src/mongo/db/geo/core.h#L509

まぁ、緯度経度逆転して扱っているプログラムが悪いんだけどさ。
急ぎの復旧だったので、MongoDBのデータベースを全消去してから
「mongodb18-10gen」でMongoDB 1.8をインストールしなおしたら、動くようになりました。
※MongoDB 2.0のデータベースをそのまま1.8で取り扱おうとしても、DB(かindex)のバージョンが新しいというエラーか警告がでるので、
DBもしっかりダウングレードしましょう。


[Django]ChoiceFieldのchoicesに関数を指定したい

Posted under python by uechoco on 水曜日 14 12月 2011 at 17 : 23 : 14

Djangoのformで、ChoiceFieldのchoicesには固定のtupleを指定したり、ModelForm任せだったりすることがほとんどだったのですが、独自に加工した一覧を出したくて、choicesに関数を指定しようとしました。

ただ、素直に関数名をforms.ChoiceField(choices=func_name)と指定しただけだと、
'function' object is not iterable
と怒られてしまいました。

どうしたものかとググっていたら、見つけました

python - Lazy choices in Django form - Stack Overflow

djangoのlazyというユーティリティを使って関数を与える方法が書いてありました!

PYTHON:
  1. from django.utils.functional import lazy
  2.  
  3.     forms.ChoiceField(choices=lazy(func_name, tuple)())

こんな感じですね。これは使える!

とか思ってたけど、やりたいことこれじゃないよ!あと1歩だった。
ModelFormにinstanceをセットして、そのinstanceの中身によって変動するchoicesって作れるのかな?(こっちが知りたかった

P.S.
結局やりたい事はModelChoiceFieldでした。知らなかった。querysetを適切に与えてやるためにFormの__init__()を上書きして必要なインスタンスを渡してあげています。だいたい以下のような感じ

PYTHON:
  1. class HogeForm(forms.ModelForm):
  2.     foo = forms.ChoiceField(choices=())
  3.     bar = None
  4.  
  5.     class Meta:
  6.         model = Hoge
  7.         fields = ('foo', )
  8.  
  9.     def __init__(self, bar, *args, **kwargs):
  10.         super(HogeForm, self).__init__(*args, **kwargs)
  11.         self.bar = bar
  12.         self.fields['foo'] = forms.ModelChoiceField(queryset=Foo.objects.filter(bar=bar))
  13.  
  14.     def save(self, commit=False):
  15.         hoge = super(HogeForm, self).save(commit=False)
  16.         hoge.bar = self.bar
  17.         return hoge.save()


[django]formでフィールド項目以外のエラーはnon_field_errors()で拾える

Posted under python by uechoco on 月曜日 28 11月 2011 at 12 : 30 : 04

djangoのformをtemplateに描画する時、以下のようにフィールド個別に要素を抽出して、デザインを個別に割り当てるなどすることが出来る。

  • {{field.label}}
  • {{field.label_tag}}
  • {{field.value}}
  • {{field.html_name}}
  • {{field.help_text}}
  • {{field.errors}}

エラーをフィールド別に独自デザインするときなどにはよく使う。

では、フィールド項目以外のエラー(例えばclean()メソッドでフォーム自体にValidateErrorが発生した場合)は、
いちいち{{form.errors}}から各フィールドの{{field.errors}}を抜き出してから表示するのか。

そんなことはない。

  • {{form.non_field_errors}}

がある。一応Django 1.0の頃からあったみたいです(フォームやフィールドのバリデーション — Django v1.0 documentation)。
覚えておくとフォーム周りで細かいデザインをしたいときに役立ちます。


[Django]forms.DateFieldのinputs_formatではまった

Posted under python by uechoco on 月曜日 22 8月 2011 at 11 : 00 : 22

Django 1.3で確認:

なんどやっても日付入力フォームのフォーマットが合わない。Formクラスの内容は以下のとおり。

[pycode]birthday = forms.DateField(input_formats='%Y/%m/%d')[/pycode]

いろいろとググってたら正解が見つかった

[pycode]birthday = forms.DateField(input_formats=('%Y/%m/%d',))[/pycode]

どうやら"input_formats"と複数形のとおり、複数個指定できるようにタプルで渡してやる必要があったらしい。


[Django]Caught AttributeError while rendering: ‘NoneType’ object has no attribute ‘label’

Posted under python by uechoco on 水曜日 27 7月 2011 at 16 : 08 : 51

Django 1.2.6を使っているのですが、

  • ModelFormをテンプレートで{{ form }}で表示している
  • ModelFormはMetaクラスでfields属性でカラムを制限している

ときに

TEXT:
  1. Caught AttributeError while rendering: 'NoneType' object has no attribute 'label'

というエラーによく遭遇する。

書いたコードはこんな感じ

PYTHON:
  1. # -*- coding: utf-8 -*-
  2. from django import forms
  3. from foo.models import Hoge
  4.  
  5. class HogeCreationForm(forms.ModelForm):
  6.     """
  7.    Hogeを登録するためのフォーム
  8.    """
  9.     class Meta:
  10.         model = Hoge
  11.         fields = ('name')

何が間違っているかというと、fieldsのタプルが1項目しかないので、タプルとして認識されていない。

PYTHON:
  1. class HogeCreationForm(forms.ModelForm):
  2.     class Meta:
  3.         model = Hoge
  4.         fields = ('name', )

というようにタプルのカンマが抜けているのが原因だった。タプル慣れないね。


次ページへ »

Copyright © 2012 うえちょこ@ぼろぐ. WP Theme created by Web Top.