2009年12月2日水曜日

Django HttpRequest の処理に嵌る

 条件検索を付加しようとして、check box で選択条件を入力し POST で送るところまでは出来たのだが、view に渡される request がうまく処理できない。
 aptana の変数表示を見ると、どう見ても値がリストの辞書なのだが、辞書のつもりで扱うとうまくいかない。値を取り出そうとするとリストの最後の要素しか取り出せない。

 よくよく見ると型が 'Querydict' となっている。フツーの辞書型じゃないの?と調べてみると...。
QueryDict オブジェクト

HttpRequest オブジェクト内では、 GET と POST 属性は django.http.QueryDict のインスタンスです。 QueryDict は辞書ライクなクラスで、同じキーに対して複数の値を取り得るようにカスタマイズされています。これは、 HTML のフォーム要素には、例えば <select multiple="multiple"> のように、同じキーに対して複数の値を渡すものがあるからです。
 ですと。「ライク」ってことは似て非なるものってことね。

 結局 getlistを使ってリストの形で引き出すことに成功。

 なんとか動いた。

 あとはブラッシュアップとバグ出しか。

 どこまで飽きずにモチベーションを維持できるか...

 

2009年12月1日火曜日

Django 0.96 向けのユーザー登録を 1.0 で動くように直した


 ユーザー登録自体は必要ないのだが、POST を使ってデータを送るサンプルで手元にあったのが、最新Pythonエクスプローラ の中のサンプルプログラム djmall のユーザー登録だけだったので、これを Ver 1.0 で動くようにした。

 一番戸惑ったのは、新規登録時の画面遷移がちょっとおかしい予想したのと違っていたこと。結局古い python + Django でプログラムを実際に動かして画面遷移を確認した。

 主な変更部分は以下の二つ。

  • User オブジェクトがだいぶ変わっていた。古いバージョンでは validation の機能もあったらしいが、1.0 からは 完全にモデルのサブクラスになっていて、validation は User から ModelForm で作ったフォームでおこなう
  • User のメンバ変数が変わっていた。last_login_date,last_login_time が last_login に、date_joined_date,date_joined_time が date_joined にそれぞれ一本化。validation に失敗したので、ソースを追っかけて判明。

 結果としてはこんなところだが、動くまでに2時間ほどかかってしまった。
 ま、POST 関連の動きもわかったし、良いことにしよう。

 ちなみに変更後のソースは以下のとおり。
from django.forms import ModelForm
class UserForm(ModelForm):
class Meta:
model = User

def regist(request):
if request.method == 'POST':
new_data = request.POST.copy()
now = datetime.now()
new_data.update({'last_login': now.strftime("%Y-%m-%d %H:%M"), 'date_joined': now.strftime("%Y-%m-%d %H:%M")})
manipulator = UserForm(new_data)
if manipulator.is_valid():
username = new_data['username']
email = ''
password = new_data['password']
user = User.objects.create_user(username, email, password)
user.is_staff = False
user.is_superuser = False
user.save()
return HttpResponseRedirect("%s%s" % (settings.MALL_BASE, '/accounts/login/'))
form = UserForm()
return render_to_response('registration/regist.html', {'form':form },context_instance=RequestContext(request))
 

2009年11月30日月曜日

Django 次のステップへ

 とりあえず某 HP がそれなりにコピーできたので、目玉の条件検索機能を追加すべく新たに色々色々と調べにかかる。

 [条件検索]のボタンを押すと、新たに一枚ブラウザを開き、その中に選択肢を並べ、チェックボックスで選んでもらって検索、という形にしたい。
 手元にある参考書に似たような機能はあるのだが、これが Django の 0.96 用で、使っているメソッドが 1.0 ではバッサリ落ちている。

 一応、「アプリケーションを Django 0.96 から 1.0 に移行する」というページがあって、「newforms の代わりに django.forms を使う」の中に書かれているoldforms というのを使っているのだが、「古いフォームシステム (以前は django.forms と呼ばれていた django.oldforms)を使っているのなら、フォームを書き直す必要があります。まずは forms のドキュメント を読むところから始めてください。」ですと orz

 きちんとお勉強するか、代替方法をネットで探すか、いや、サンプルソースのありそうな本を探すか。

Django MVC ってのは、

 今の作業で大まかなところが落ち着いてきて表示部分の細かいところをやっているのだが、MVC ってのは、ソースがバラバラといろんなところに散らばるだけのような気がしてきた。

 テンプレートに for と if を放り込んで条件分岐させ、それでも足りなければフィルター・タグを作る。汎用 view を使うためには更にコードが散る。

 んー、かえってメンテナンス性が落ちないか?

 なにか根本的なところでオイラが間違っている気もしないでもないが...。

2009年11月28日土曜日

python+SQlite データ移行プログラムで嵌る

Django 側で None のデータの扱いに問題があった。一時間以上嵌る。

 NoneType というのは覚えておこう。

2009年11月27日金曜日

Django+sqlite PositiveIntegerField は

 blank=True と設定したら、admin の画面から save 出来なくなった。どうやら null=True も同時に設定しないとだめなのか?

 他の数値系の型もたぶん同じ?

Django Invalid block tag っていうエラーが出た

 原因は....、

 {% endi %]
^^^

 というのがいくつか(^^;入っていたため。

 これで tag のネストが狂ったらしい。