2009年12月28日月曜日

デブロイ準備

 django で組んでいるアプリケーションが形になってきたのでそろそろインストールデブロイのことを考え始める。

 安そうななレンタルサーバーを探したが、今使っている xrea が格安・高機能なのでこれにインストールすることを前提に、同じバージョンの apach,python あたり自前のサーバーにインストールすることにする。

 

2009年12月20日日曜日

Django URL の長さって...

django の models.URLField に google map の URL コピペして、表示されたページのリンクから google map を表示させようとしたら
{errorText:"サーバーに接続できません。"}
 と出てきて地図が表示されない。

 調べていくと、google map の URL が 362 文字で、models.URLField の max_length の defautl が 200。

 200 文字でも結構なものだと思うが、では最長はいくつかと調べてみると...、ハッキリしないが IE の 2083 文字ブラウザの中では短めらしい。ただその IE も、ちょっといじると 4095 文字までは行くみたいなので、思い切って max_length=4096 でデータベースを作り直し。

 無事問題は解決したが、こういうのは富豪プログラミングのひとつか?いや、仕様がそれを要求しているんだろうなぁ。

2009年12月16日水曜日

Django djangoproject jp が落ちている

 ちょっと前も調子の悪いときはあったのだが、今回は昨日今日とアクセスできない。昨日はトップページは見られたのだが、今日はそれもだめ。

 むぅ、タダで使わせてもらっているので文句も言えんか。英語サイトしか読めないと効率落ちるなぁ (; ;)

2009年12月15日火曜日

Django まじですか

 サイドバーのあるいまどきのページを作って、サイドバー部分は Django に色々やらせてメインの部分は html のファイルを読み込ませて表示しようとした。

 テンプレート中で include タグを使って固定メッセージを読ませようとしたのだが、読み込まない。パスの指定を間違ったか、サブディレクトリを切ったのがまずかったかと色々試したがうまくいかない。
 すでに問題なく表示できている固定メッセージの html ファイルをそのディレクトリにコピーして表示させようとするとうまくいく。何度見直してもファイル名に間違いはない。ファイル名の構文解析の問題か?
 表示されないファイルの中身を、表示されるファイルにそっくりコピペすると...、表示される。

 ?????

 結局表示されないファイルの文字コードを aptana から utf-8 に設定すると表示されるようになった。default の s-jis 設定がまずかったらしい。

 テンプレートジェネレータが utf-8 のつもりで s-jis のファイルを読み込んで、動作がおかしくなったのか。

 いろんなところで日本語は面倒だ。
----
 もともと aptana の default 文字コードが s-jis なのが問題なのだからと、default を変更。
 google に「eclipse 文字コード 設定 デフォルト」と検索すると、最初に出てきたこちらのページにやり方が書いてあった。

 これでつまらんことに時間を取られることはなくなるはず。最初にやっておけばよかった。

Python BASIC でいうところの RIGHT$ とか

 数値を表す文字列をゼロパディングする必要があって、そういえば何10年も前に BASIC で
a$ = right$("000"+val$,4)
とかやったなぁと思い出す。

 さて Python では...、
a = ('000'+val)[-4:]
とかが割りと簡単に出てきた。

# a = '%04s' % val はだめみたいだ。

 だいぶ慣れたかなぁ、Python にも。

 だけど、C に勝るとも劣らないおかしな(?)書き方が目立ってきた。

----
 とか、いい気になっていたら、
a = val.rjust(4,'0')
で済むことがわかった。まだまだだなぁ。

 しかし、ライブラリというか、標準関数を覚えるのは苦手なんだよなぁ...。

2009年12月14日月曜日

JavaScript 初めてコードを書いてみた

 ページ上で数値を入力し、ボタンを押すとその数値を組み込んだ URL にジャンプさせたくなった。手元の本をひっくり返して JavaScript で実装。ついでだからと桁数制限と全角での数値入力も可能にした。

 で、書いたコードはこんな感じ。
function LC(obj){
// 全角数字 -> 半角数字に変換
var han= '1234567890';
var zen= '1234567890';
var word = obj.url.value;
for(i=0;i<zen.length;i++){
var regex = new RegExp(zen[i],"gm");
word = word.replace(regex,han[i]);
}
if (isNaN(word)) { // 数値以外を入力
alert("数値を入力してください");
} else {
if (word.length <= 4) { // 桁数が4桁以内
location.href='/item/'+word
} else { // 桁数が4桁を越えた
alert("4桁以下で入力してください");
}
}
}
 全角->半角変換は、こちらのページのコードを参考にさせていただいた。数字だけならもっと「エレガントな解法」がありそうな気もするが、良いことにしよう (^^;
----
 手元に JavaScript の本が2冊あるのだが、どちらも web page クラスライブラリの解説書みたいな感じで、言語としての JavaScript についてはあまり触れられていない。
 もう一冊文法書を買おうか、このあたりのページを見ながらなんとか乗り切ろうか...。

JavaScript 古い本を引っ張り出してきた

 ちょっと JavaScript のコードが必要になって、本棚から本を引っ張り出してきたら発行日が2000年。この手の本を買うときは必ず発行日を見て、古くないのを買っているので10年近く前に買った本ということになる。

 昔からやる気はあったのだが...、10年近く本を眠らせていたなんて。

 懲りずにがんばろう。

2009年12月13日日曜日

Django python 可変数キーワード引数に辞書オブジェクトを渡す方法

 クリエメソッドの filter の照合パラメタをプログラムで作りたくなった。定数でも動くのだが、プログラムで書ければコードが短くすっきりする。
 いろいろやってみたが、
filter('%s_tag__name=key' % tag)
とかやってもうまくいかない。

 色々調べたがうまくいかず、一度あきらめたのだが、どうしても使いたくなり再度調べてみた。ネットで色々検索し、aptana で breakpoint を設定してあーだこーだと調べていくうちに
filter(**kwargs)
のアスタリスク二つが気になった。これって C で言うところのポインタのポインタ?

 結局、
filter(**{'%s_tag__name' % tag:key})
でうまくいった。

 この手の「呼び出す側で変数の頭にアスタリスクを二つ重ねる」は、Django のコードの中にごろごろしているし、こちらのページに動作の解説があったのだが、意味が理解できずに読み飛ばしてしまった。

 答えは目の前に転がっていたのに...。

 修行が足りん。

2009年12月11日金曜日

django Pagination を使おうと思ったら

 アイテム数が増えたのでページングを追加しようと、サンプルプログラムを見てそれらしいキーワードを見つけ、検索をかけると一番最初にピッタリのページがヒット、したんだけど使い方が良くわからない。で、次のページを開くと最初のページの元の英文ページで使い方が書いてあった。

 こういうこともあるんだ。

 

2009年12月10日木曜日

Django snippet 妙なところで嵌った

 models.py に新しい項目を追加して、データを登録、きちんと表示できることを確認して一安心したら、そのデータの管理画面が開けなくなった。

 エラーは
TemplateSyntaxError at /admin/itempage/item/8/

Caught an exception while rendering: 'FieldFile' object is unsubscriptable

2009年12月6日日曜日

Django テンプレートタグを自作する

 テンプレートに可変長のリストを渡してテーブルを作る必要があった。で、cycle タグを使って何とかならないかと思ってやったら出来た。

 が、そこのコードをループで回すと2回目のループの最初が、直前のループの最後の続きになってしまう。

2009年12月4日金曜日

Django filter_horizontal が動かなかったわけ

 項目数の多くなりそうな ManyToManyField を追加したので filter_horizontal を入れたのだが、動かない。
複数選択するときには Control キーを押したまま選択してください。Mac は Command キーを使ってください
 などというメッセージは表示されるが、選択肢を選ぶ「窓」が全く表示されない。

 調べていくと...、

 ManyToManyField の verbose_name 引数に漢字を使っていたのだが、クオーテーションの前に u をつけていなかった orz。

 決められたことはキチンとやらないと...

Django フィルターを作っていて

 リストを引数に取ったはずが、文字列、それも aptana の watch window に表示される形そのままが引き渡される。

 あっちこっち調べていると...、

 ソースを良く見ると、フィルター宣言の前に @stringfilter というデコレーターが。
@register.filter
@stringfilter
def top_line(value):
 これはどうみてもだめでしょう。

 何も考えずにコピペしてはいかんなぁ。

2009年12月3日木曜日

python データ変換プログラムのデバッグ

 テーブルに変更があったのでデータを移行しようとしたらエラー...。

 調べていくとデータの中に '"'(ダブルクオーテーション)が入っていた。今回新たに html を追加したんだっけ。

 調べた結果、今回判ったこと。
 ということで、クオーテーションをダブルからシングルに替えて動くようになった。データにシングルクオーテーションが紛れたらどうなるかという問題は...、そのときはそのとき (^^;

 あと、覚えたてのリスト内包表記を使ってコードを少し縮めてみた。確かに短くなった上にわかりやすい。

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 のネストが狂ったらしい。

2009年11月23日月曜日

python オブジェクトのコピーって

 いちいち copy とか deepcopy とかの関数を呼び出してやらなくちゃならないのね。

 C++ なら 'A = B' で、オブジェクトそのものをコピーするのだが、Python だとポインタのコピーにしかならない。

 少々嵌った。

 関数の引数も全部参照渡しだそうだ。C++ のときは暗黙の参照渡しのプロトタイプは禁止してたのに、python では default か。

 トラップでいっぱいだ。

2009年11月22日日曜日

Django save する前に pk(id)を得る方法

 db.models.base.py のsave() メソッドあたりのコードを読んでみたが、ナニを書いているのかさっぱりわからなかったので、変数というかオブジェクトというかをデータベースに登録して管理というか、自前で計算することにした。

 models.py にこんな感じで追加
class LastId(models.Model):
lId = models.PositiveSmallIntegerField()
def get_id(self):
return self.lId

def inc_id(self):
self.lId = self.lId + 1
self.save()

def set_id(self,value):
self.lId = value
try:
lasId = LastId.objects.get(pk=1)
except:
lasId = LastId()
lasId.set_id(0)
lasId.id = 1
lasId.save()

class Item(models.Model):
def getId(self,name):
if self.id is None:
self.id = lasId.get_id() + 1
return u'cars/%s/%s' % (self.id,name)
...
def save(self, force_insert=False, force_update=False):
if lasId.get_id() + 1 == self.id:
lasId.inc_id()
super(Item,self).save(force_insert, force_update)
 難点は、manage.py syncdb を実行するときに try: ... lasId.save() をコメントアウトしないとエラーになること。インスタンス生成部分を別ソースに移動したりと色々やってみたが回避できない。from の循環参照を回避できればなんとかなりそうだったので C/C++ のようにプリプロセッサのマクロとかあればなんとかなりそうなんだが。
 該当箇所をコメントアウト -> syncdb を実行 -> コメントアウトを外す、とひと手間かかる。サーバーにインストールするときは、sqlite のデータベースも一緒にコピーする必要がある。

 「エレガントな解法」がありそうな気はするのだが...。

2009年11月21日土曜日

aptana + subversion 使い方がわからない

 古いソースが見たくなって update to revison をしたら、当のソースに古いソースと差分が (diff の出力みたいな感じで)混じってしまった。

 こんなこともあろうかと、あらかじめバックアップしてあったソースと差し替えると、今度は conflict してコミットできない。

 結局 synchronize の画面でそのファイルを右クリック -> Mark as Marged を選択してコミットできるようになった。

 なにがなんだかさっぱりわからない。

 この壁を越えないと subversion を使う御利益は出ないのだろうが、高そうな壁だ。

2009年11月20日金曜日

Django 大ポカ

  class Foo(models.Model)
__unicode__(self):
return {int の変数}


 としたばっかりに、このクラスを管理画面から更新・追加するときに

coercing to Unicode: need string or buffer, int found

 なるエラーがでて2時間ほど時間をドブに捨ててしまった...orz

----
 て、わかってからエラーメッセージ + Django を丸々 google 様に食わせたら一発で答えが出てきた orz。

2009年11月19日木曜日

Django+python pk が db に書き込ま前に必要なんだ!

 db に書き込む前のインスタンスの pk を知る必要が出てきたので、悪戦苦闘

 最新の pk を記憶する専用のクラス・インスタンを作って管理しようとしているのだが、なんとかうまくいきそう、なんだが疲れたので時間切れ。

 余分なところで時間がかかる。

---
 あと、unbound method save() must be called with LastId instance as first argument (got nothing instead) 系のエラーで嵌った。
 オイラの場合はリンクの循環というのではなく、f = Foo() と書くべきところを f = foo と書いて f.save() とやってしまったこと。インスタンスではなく、クラスのメソッドを呼び出そうとしたという意味か?

2009年11月18日水曜日

aptana subversion を使えるようにした

 今までは統合環境を使わず、ソースをいじるのも一人だったのでバージョン管理システムなど使わず、適当なタイミングでディレクトリ全体を lha でアーカイブしていたのだが、django で開発していると異様にファイルの種類が増える(python のソース、テンプレート、画像ファイル、データベースファイル)のと、eclipse が subversion のクライアントをサポートしているので、使ってみることにした。

 クライアントのインストールは aptana(2.0.0.1256072654) の Help->Install New Software を選択し、開いたダイアログの Work with は All Available Site を選択、Name は Collaboration から Subversive SVN 関連の二つを選択してインストール。


----
 次は subversion のインストール。使ったのは VISUALSVN SERVER。一発インストールで apache までインストールしてくれるそうな。便利な世の中になったもんだ。
 ちなみに、subversion の URL は、管理画面のツリーの一番上を開くと出てくる。


----
 続いては、既存のプロジェクトを subversion のリポジットに登録すること。既存のプロジェクトは登録できないと思い込み、既存のプロジェクトをコピーして新しいプロジェクトを作ろうとしたがうまくいかず。
 調べてみると、プロジェクトの親ホルダーの上で右クリックして team->share project を選択すればよいことがわかる

----
 手順をこのブログにまとめるところまでで2時間半。果たして、元は取れるか??

2009年11月17日火曜日

aptana リストア

 テストプロジェクト中のデータディレクトリを削除するつもりで、メインプロジェクトを削除してしまった (; ;)

 バックアップを引っ張り出して色々やってたら、プロジェクトとしての登録が消えただけで、プロジェクトファイル一式は丸々残っていた。

 これをインポートすれば良いだけの話だったのだが....。

 ためしに、最初にディレクトリ名を変えてリストアしたソースをインポートしようとしたら、aptana がハングアップ。aptana を再起動したらプロジェクトが復旧していたがなぜか動かない。
 調べていくと、結局プロジェクトの復旧がうまくいっていなかったようだ。

 もともとあったディレクトリをインポートして解決。

 こんなことに一時間ほどかかってしまった。やっぱり統合環境は嵌ると時間を食う。

2009年11月16日月曜日

Django+python pk は db に書き込まなくてもわかった

 色々やっているうちに、aptana の Variable window を見ていると、目的のインスタンを :と表示している。

 もしやと思って str(<インスタン>) とすると、 id(pk) を返してくる。db 書き込み前でも。
 インスタンスを評価すると id(pk)を返してくるとは。Django 恐るべし、いや python 恐るべし?単に def __unicode__ で self.name を返していて、インスタンの name に 1,2,3... と入れているだけだった。orz

 どうしよう?

Django+python pk は db に書き込むまでわからない

 インスタンスの画像データを pk を含むディレクトリに入れようとしたら、動かない。この間は出来たのにと思い調べると、
・修正のときは動く
・新規登録のときは動かない
ことが判明。db に登録前は pk が無効ということが判明 orz。

 じゃあ自前の変数に pk のコピーを持とうかと思ってコンストラクタをオーバライドしたら動きが変。
 調べていくと、オーバーライドしたコンストラクタが、もとのコンストラクタを、引数を全部準備して呼び出さなくはならないことが判明。
 引数が合わなくてもエラーもワーニングも出さないんだもん、python って。いや、MT のライブラリのバージョンが合わないときもこれで嵌ったから ll 全般の傾向か。
 メソッドをオーバーライドするときは親のクラスの元のメソッドを調べなくてはならないことが判明。これって C++ では当たり前だったっけ?少なくとも引数の型が合わないとエラーになったはず。
 こういう不具合の種をまかないために型チェックが厳しくなったはずなのに...。

 import している models の場所がわからなくて結構探した。おいらの環境では C:\Python262\Lib\site-packages\django あたりにあるらしい。

2009年11月14日土曜日

Django ImageField をいじる

 ImageField をこちらの delete box 付きに変更し、ファイル名入力のヨコに小さなイメージを付け、イメージファイルの保存ディレクトリにインスタンスの ID をつける。

----
 気が付けば中三日も休んでしまった orz。

2009年11月9日月曜日

Django Item 削除時の画像削除

 デストラクターをオーバーライドして一発でした。なまってるなぁ。

 けど親クラスのメソッドをオーバーライドしたとき、親クラスのメソッドを自前で呼び出さなくてはならないとは。
 あと、self の扱いが面倒だ。C++ の this はデフォで書かなくて済むんだけどなぁ...。

 あと、なんだか動作が不安定に。フレームワークとデータベースエンジンを使う意味が....

 

Django 管理画面のリストに画像を追加


 管理画面から Item を削除するとき、画像も一緒に削除できないかと探していたら、こんなページを発見

 管理画面の一覧に画像を表示することもやりたいことのひとつだったので、さっそく挑戦。

 なんだかんだと2時間近くかかって実装。
    def thumb(self):
tinythumb = unicode(self.photo11).replace('\\','/').split('/')
tinythumb[-1] = 'tiny/'+tinythumb[-1]
tinythumb = '/'.join(tinythumb)
if not os.path.exists(settings.MEDIA_ROOT+tinythumb):
im = Image.open(settings.MEDIA_ROOT+unicode(self.photo11))
im.thumbnail(TINY_SIZE,Image.ANTIALIAS)
im.save(settings.MEDIA_ROOT+tinythumb,"JPEG")
return """tiny thumbnail image"""%(settings.MEDIA_URL,unicode(self.photo11),settings.MEDIA_URL,tinythumb)
thumb.allow_tags = True
thumb.short_description = 'XXXX'

 元が 0.96 用だったせいもあってだいぶ嵌った
・オリジナルは models.ImageField を単なる文字列として扱っているが、unicode()で括ってやらないと文字列操作のメソッドが使えない
・Image.save() で書き込むときは、ディレクトリがないとだめ。models.ImageField のときは勝手に作ってくれたのに...
・html に吐き出す url の文字列でだいぶ悩む。結局もとの media を site_media に変更。URL の root からアプリケーションを動かして嵌ったのは2度目。そろそろ覚えんと。

aptana のデバッグ機能がなければ、今回は歯が立たなかったかも。

todo:画像の削除

 管理画面で Item に登録した画像を Item 削除時に削除すること。

2009年11月7日土曜日

Django 新規プロジェクト作成で嵌る

 画像の扱いを調べるために小一時間はまってしまった。0.96 ベースの本とうろ覚えの知識、動いているソースを元にしたのが原因か?最初からチュートリアルを見ればよかった。

 今回引っかかったところ。

1.python django-admin.py startproject が動かない。調べてみると django-admin のスペルミス orz

2.追加した model が管理画面に表示されない。INSTALLED_APPS にアプリを追加していなかった。

3.起動途中でエラー。models.py の先頭行に # -*- coding: utf-8 -*- をいれずに漢字を使っていた。実行するとコンソールにエラーが何行も出てくる。

4.models に追加した XXXAdmin が、なぜか admin.py から見つからず(XXX のクラスは認識していた)。ファイルを書いたり消したり、文字列を削除したり直したりしているうちに動いた。原因不明。

Django ひっかかった

 class のメンバに BooleanField を追加して、初期値を True にすることにした。

 最初に、コンストラクタの __init__ を使って初期化しようとすると、管理画面で一覧が出なくなってしまった。

 深追いはやめて、BooleanField で検索をかけるとこういうページが出てきた。初期値の設定は initial ね。initial=True と書くと...、エラーになる。もしかして 'inital=True' と書くと...、動いた。けど、初期値が True にならない。他のメンバを見ると...、シングルクオーテションで括っていない。よくよく見ると... forms.Form って?

 初期化したかったのは models.Modelの BooleanField、ドキュメントを見ていたのは forms.Formの BooleanField
 クラス名は同じようなというか、同じのがたくさん並んでいるのにオプションが違う。

 結局 default=True で目的は果たす。もちろんシングルクオーテションでの括りはなし。

 紛らわしい。

2009年11月6日金曜日

aptana うそでしょう?

 サイトのデザインをいじっているうちに、<table> で作ったタグがまともに表示されなくなる。<table>の中のタグがレンダリングされずに、テーブル配置後の文字列だけが html にレンダリングされていたり。
 色々いじくり回してもだんだんおかしくなるばかりなので、新しい表を作って色々やっていくと...。

 aptana の HTML エディターでは、表示から半角の空白と全角の空白を判別できない !!

 少なくともオイラの(たぶん)デフォルト設定で UTF-8 の .html のファイルはそおなっている。

 これは嵌る、要注意だ。

aptana HTML ファイルを編集しようとしたら

 Django の template を編集しようと .html のファイルをひらいたら、激しく文字化け。
 エディターのプロパティーを開いてもエンコーディングらしき項目はなし。

 困ったときの google 頼み、'eclpse html 文字コード'でこんなページを見つけた。ファイル毎にコード属性が付くわけね。

2009年11月5日木曜日

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

 先日作ったデータ移行プログラム、テーブルが増える分には動いていたが、テーブル内の item が増えると動かない。ロジックに問題があったのと、NULL 不可に引っかかって遊ばれる。

 ほぼ半日かかってしまった。

 昨日今日と、こんなのばっかり。

2009年11月4日水曜日

Django どうでもいいところで嵌る

 管理画面をあれこれしている中、一覧の表示に ManyToManyField を出したくなった。

 こちらのページを参考にしてコードを変更したら表示された、んだけど日本語が unicode のコード表示([u'\u5036\u77e5\u5b89\u753a\u82b1\u5712'])。

 これは、データー変換プログラムで悩んだから大丈夫だろうとあれこれやっていくが...、うまくいかない。

 結局コード変換の問題というより、戻り値がリストだったことが原因だった模様
def selected_tags(self):
'''return selected tags'''
tag_titles = []
for tag_obj in self.tags.all():
tag_titles.append(tag_obj.title)
return tag_titles
 の最後の行を
return tag_titles[0]
にしたら正常に日本語が表示された。

----
 aptana 、さっそく役にたった。

 

Django 管理画面を変えるのに嵌る

 0.96 -> 1.0 でちょっとしたというか、大きなというか、互換性のない変更があったようだ。参考にしている本が古いと余分なところで時間を喰われる。

 最初にやったこと
models.py のモデル定義の中に
class Admin:
list_display(....)

を追加

 実際には、
新たに Admin 用の専用クラスを追加して、そこに list_display を追加し、admin.site.register() で、そのクラスを追加する

modles.py はこんな感じ
class Item(models.Model):
# class Admin:
# list_display = ('tags',)

from django.contrib import admin
class ItemAdmin(admin.ModelAdmin):
list_display = ('start_date','item_code',)


admin.py はこんな感じ
from django.contrib import admin
from ecsite.itempage.models import Item,ItemAdmin
from ecsite.itempage.models import Tag ^^^^^^^^^
from ecsite.itempage.models import typeTag

admin.site.register(Item,ItemAdmin)
^^^^^^^^^^
 参考になったページはこちら。バージョンの違いに要注意。

----
 aptana は一度使うと手放せないかも (^^;

 

2009年11月3日火曜日

aptana + dajngo 何とか使えるようになる

 前のエントリーで、
 起動するようになったのはいいんだけど、Debug で起動しても aptana の管理を離れてバックグラウンド化してしまう。
 こうなるとデバッガーの意味がないんですけど。
 正確には python のプログラムがひとつ起動したあと、子プロセスとして django の本体が起動する。で、aptana の管理が及ぶのは親のプロセスだけで、django 本体はデバッグも出来ないし aptana からは止めることも出来ない。
 これだと高機能エディターとしか使えないんですけど...。

 あきらめかけたところで、参考にしたサイトに書いてあったことを思い出す。
 'noreload' ってなによ?と調べてみると、非常に怪しい機能。Ver 1.0 でもサポートはしていて、前につける記号が '-' ではなく '--'。

 さっそく「プログラムの引数」に '--noreload' 追加すると、うまくいった。

 これで IDE のデバッグ機能が使えるようになった代わりに、止めずにコードを直してデバッグを進めることはできなくったわけだ。ま、待つ場所が一箇所のイベントドリブンだから大勢に影響はないか。

 結局 aptana + Pydev で Django のコードが開発できるようになるのに1日近くかかってしまった。新しいツールの導入コストはやっぱり安くない。

 これから使い方は覚えなきゃならないし、django のテンプレートは aptana が対応してないみたいだし、元が取れるのかなぁ?

aptana + django aptana で Django が動き出す

 aptana をインストールしたあと、こちらのページを見ながらプロジェクトを aptana の下に移動。

 オイラの環境では
「引数」タブの「プログラムの引数」に「runserver –noreload」と入力します。
のところで、'-noreload' のオプションを受け付けなかった。

 動かそうとすると、
Error: [Errno 10013] アクセス許可で禁じられた方法でソケットにアクセスしようとしました。
 ??。aptana って、admin 以外で実行しているの?とりあえず、コマンドプロンプットから実行しても同じエラーがでる。aptana を終了するとコマンドプロンプットからは正常に起動する。

 ネットでちょっと調べてみるとこんなページが
 なんだ、エラーメッセージが間違ってるじゃん。

 結局「プログラムの引数」を「runserver localhost:8001」にして正常に起動するようになった。

 起動するようになったのはいいんだけど、Debug で起動しても aptana の管理を離れてバックグラウンド化してしまう。
 こうなるとデバッガーの意味がないんですけど。

 やっぱりすんなりとは行かないものだ。

---
追記
runserver localhost:8001 --noreload
で動くようになりました。
 
 

2009年11月2日月曜日

Django Empty module name であせる

 汎用ビューに挑戦中、Value Error,Empty module name なるものが出てあせる。

 汎用テンプレートを空にしても同じエラーが出る。ということは、テンプレートの内容ではない。
 動いてるアプリケーションのソースを切り貼りしているだけなんだが...。ネットをちょっと探してもピッタリのものが出てこない。

 ネットの海におぼれる前に、直近でやったこととエラーメッセージを見てよく考える。

 結果、setting.py への追加に問題あり。

TEMPLATE_CONTEXT_PROCESSORS = (
'django.core.context_processors.auth',
'django.core.context_processors.debug',
'django.core.context_processors.i18n',
'ecsite.itempage..itempage_context.itempage_context',
)
 ピリオドがひとつ多くてファイルが探せないだけ。

 ロケットが明後日の方向に飛んでいかなくて良かった。

2009年11月1日日曜日

Django ようやく MVC がわかった

 ようやくMVC がどういうものか体感できた。テンプレートの使い方もわかってきた。

 大きな山を越えるとだいたいモチベーションが落ちて、尻切れトンボになることが多いので、ここが頑張りどころ。

 とりあえず動けばいいでコーディングを進めてきたので、一度リファクタリングでもしようか。

2009年10月31日土曜日

Django 作業メモ:django に静的ファイルを読ませるのに嵌る

 今作っているアプリで静的ファイルを読ませる必要が出てきた。

 以前に嵌ったことを思い出してこのブログを調べると、ピッタリなエントリーがあった。このエントリーを見て書いたソースをコピペして...、動かない。
 Page not found のメッセージではちゃんと media/ は定義されてるし、なぜ?

 ふと、コンソールを見ると他の URL を書き換えていない静的ファイルの読み出しはリクエストが失敗しているが、URL を書き換えたものだけが失敗していない。
 ブラウザに直接静的ファイルのディレクトリの URL を入力すると、とんでもないディレクトリ(C:\Python262\lib\site-packages\django/contrib/admin/media\)にアクセスできない、と出てくる。

 色々やった結果、
 django.views.static.serve を呼び出すパターンに 'media' は使えないsettings.py の中で定義している ADMIN_MEDIA_PREFIX と同じ文字列は使えない

# ただし、root の urls.py 以外ではぶつかってもよさそう。

 ということがわかった。パターンを 'media' からドキュメントにある 'site_media' に変更して解決。うーん、古いアプリケーションでは使えていたのだが。1.0 からこうなったのだろうか?元にしたアプリケーションではアプリケーション名が URL に含まれたのでこの問題が起きなかった。
 面倒くさいから深追いはしないが...。

2009年10月30日金曜日

Django ようやくフィルターが使えるようになった

 データベーススペシャリストで勉強したことがだいぶ役に立ってきた。 

 これでようやく全体の構成というか動線の設計に入れる。ここからがまた一苦労か。

2009年10月29日木曜日

Django XX.objects.get() の help



という位置にある。一番下のページを開いて get で検索すると出てくる。

Django XX.objects.get() no

Django eclipse を試してみよう

 ツールの作成が終わったので、ようやく本命の Django のコーディングに戻ったが、これがまた面倒なことに。

 Vz->Wz とエディターを使ってきたのだが、最近のソフトウェア開発環境で使い続けるには無理を感じていた。で、思い切って2年前会社を辞めたあと、自宅のメインマシンを入れ替えたときに Wz をインストールしなかった。

 タコメータの製作は gcc 一本だったのでフリーのエディターで何とか乗り切ったが、データ移行ツールを作ったときに pyscripter で IDE の威力を実感。

 eclispe で Django も出来るそうなので、そっちの環境を構築しようと思う。

 あぁ、また時間が取られる...。

 

2009年10月28日水曜日

Python + SQLIte + TkInter データ移行プログラム、とりあえず動く

 Django でサイトを作っていて、テーブルが増えてしまったとき、テスト用のデータベースを一から作り直さなくても良いように、古いデータベースからテーブルの追加されたデータベースに既存のデータを移行するプログラムを作っていたが、とりあえず動作確認が出来た。

 ということでまた Django に戻って悪戦苦闘。

2009年10月27日火曜日

Python + SQLIte + TkInter Python の文字列は一癖あるらしい

 ネットワークスペシャリストの試験も終わったので作業再開。

 IDE で実行してエラーで止まってはチョコチョコ直すというあまりよろしいとは思えないデバッグを繰り返すが、初物のオンパレードだから仕方あるまい。

 sqlite に喰わせる SQL 文を作るところで

> coercing to Unicode: need string or buffer, list found

 などという見当の付かないエラーが出てきたのでぐぐって見ると、python の文字列の扱いというのは実に変わったオイラの知っている範囲では見たことのないタイプのようだ(こちらこちら)。
 ま、文字コード関連は他の言語でも十二分に複雑怪奇なんだから、まるっとカプセル化してしまうのはありだと思う。



 

2009年10月3日土曜日

Python + SQLIte + TkInter まとまったコードを書いてみたが

 ようやく SQLite と TkInter の小手調べが終わって、長めのコードを書いてみたら、いろいろと引っかかる。

 名前のスコープの範囲というか、デフォルトの省略形が light weight。リストとか辞書とか、やるぐらいならこっちの方にも少し気を使って欲しいのだが...。

 今日は構文エラーが出なくなったところで時間切れ。

 明日は動かしながらデバッグだ。先は長そうだがあと2-3日で何とかしたい。

2009年10月2日金曜日

Python + SQLIte + TkInter ちょっとしたツールを作るつもりが...

 PyScripter を使っているのだが、インタープリターだから、デバッグ実行中にコードを直したら、新しいコードで走ってくれるかと思ったらさにあらず。

 値のコピーのつもりがアドレスのコピーになっていて手こずったり、と思えばそうでもないのか?

 ちょっと凝ったことをやろうとするとやっぱり手ごわい。

2009年9月29日火曜日

Python + SQLIte でテーブル名を読み出す方法

 昨日はフィールド名を読み出したのだが、よく考えるとテーブル名も読み出さなくてはならない。
 検索すると、こんなページを発見。要は、sqlite_master というテーブルがわかればよいわけで。

# しかし、こういうことを「教えて!goo」で教えてもらうとは思わなかった (^^;
import sqlite3
con = sqlite3.connect("ecsite.sqlite")
c = con.cursor()
c.execute(u"select name from sqlite_master where type = 'table'")
tbl = []
for row in c:
tbl.append(row[0])
 こんな感じで実行すると、
C:\Python262\projs\db-test1>python test1.py
auth_group
auth_group_permissions
auth_message
auth_permission
auth_user
auth_user_groups
auth_user_user_permissions
django_admin_log
django_content_type
django_session
django_site
item
item_tags
itempage_tag
 こんな感じで出てくる。

 データーベーススペシャリストとしての知識がこんなところで生きてくる。

----
 必要なパラメータは出揃ったし、マンマシンインターフェイスは Tkinter を使って GUI でなんとかなりそう。

 明日からはプログラム本体のコーディングだ。

2009年9月28日月曜日

Python + SQLite3 でフィールド名を読み出す方法

 某 HP を Django を使って CMS化しようとしているのだが、データーベースの設計をいい加減 agile にやっているのでテーブルのフィールドがポンポン増える。
 そのたびに新しくデータベースを作り直す(データを入れなおす)のが面倒なので、データ移行ツールを作ることにした。

 言語は練習も兼ねて python。SQLite3 のインターフェースを標準装備しているのでチャチャと...、フィールド名が読めない。PHP では嫌でもついてくるようなのになぜ?

 結局一時間以上探し回って、なんとか出てきた。

import sqlite3

con = sqlite3.connect("ecsite.sqlite")

c = con.cursor()
c.execute(u"select * from item")
print c.description
 実行結果はこんな感じ
C:\Python262\projs\db-test1>python test1.py
(('id', None, None, None, None, None, None), ('item_code', None, None, None, Non
e, None, None), ('item_name', None, None, None, None, None, None), ('item_land_s
q', None, None, None, None, None, None), ('item_land_tubo', None, None, None, No
ne, None, None), ('price', None, None, None, None, None, None), ('start_date', N
one, None, None, None, None, None))
 ちなみに肝は cursor を実行してから execute を実行すること。これが逆だと None しか表示されない。英文の資料では execute しか見つけられず、日本語訳でやっと発見。

 英語読解力はまだまだだ。

2009年9月23日水曜日

Djang:3桁カンマ区切り

一時間以上探しまわってこちらのページを見つけた。

 C あたりなら標準関数でも出来るし、わからなくても力技でいける。
 そんなことを探すのに一時間もかかるというのが初めての言語を使うハードルだよなぁ。

 しかし、humanize って。こういう発想は C++ までで終わってる人にはないよなぁ。

Django:admin で日本語入力したらエラー

 Django 0.95 で動いていたコードを 1.00 で動かそうとすると、管理画面で日本語を入力しようとすると UnicodeEncodeError が。

 探しているとこんなページ(http://www.metareal.org/2008/04/11/django-unicode-encode-error/)を発見。あっさり解決。

 だけど __str__ を __unicode__ に変えるって、どこかで読んだなぁ。

2009年7月4日土曜日

'Template u'base' cannot be extended, because it doesn't exist'

現象;template の {% extends 'base.html' %} が 'Template u'base' cannot be extended, because it doesn't exist' とエラーになる。

原因:settings.py の TEMPLATE_DIRSの設定が間違っていた

対策:TEMPLATE_DIR を修正
 変更前:"C:/Python262/projs/mysite02/mall/templates"
 変更後:BASE_PATH, 'templates'
     (BASE_PATH は "BASE_PATH = os.path.dirname(__file__)")

エラー:'humanize' is not a valid tag library

現象:template の {% load humanize %} が "TemplateSyntaxError: 'humanize' is not a valid tag library: Could not load template library from django.templatetags.humanize, No module named humanize" とエラーになる。

原因:settings.py の INSTALLED_APPS に 'django.contrib.humanize' がない。

対策:settings.py の INSTALLED_APPS に 'django.contrib.humanize' を追加。

2009年7月3日金曜日

何とか動いた

 最新Pythonエクスプローラの Django ソース (djmall) が、最新の安定版 python 2.6.2 と Django 1.0.2 finalでなんとか動いた。Django の細かいところがずいぶんと変わっているようだったが、setting.py を中途半端に変更していたことも動かなかった大きな原因。設定ファイルは昔から鬼門。

 これでようやく雛形が手に入ったのでボチボチやっていこう。

2009年7月2日木曜日

思い出しつつ...

 心機一転(?)、最新の安定版 python 2.6.2 と Django 1.0.2 final を入れて作業開始。

 前回やりかけのソースをマルッとコピーして少しずつ動かして、なにをしていたか思い出す。

 最新 Python エクスプローラの Django ソース (djmall) を、新しい Django/python で動かそうとしていた。
 ここや前のブログを読みながら作業再開。
 とりあえず今日は

from django.core import validators

 がエラーになった。なんで?


 

久しぶりにやろうか

 しばらく電子工作をがんばっていたのだが、大体形になったところで厭きたモチベーションを維持できなくなってしまった。

 ので、こちらに乗り換え。4ヶ月以上間が開いてしまった。おもいだすだけでもだいぶかかりそうだ。

2009年2月28日土曜日

[Django]一ヶ月ぶりに触る

 大まかなところを思い出すだけで一時間以上かかってしまった orz。先は長い。

2009年1月28日水曜日

[Django]Django から html を吐く

こちらのページを参考に、とりあえず HTML を吐かせた。

 ようやく web アプリケーションフレームワークっぽくなってきた。

2009年1月25日日曜日

[Django]標準の認証フレームワークを使ったときのリダイレクト先

urls.py を

> (r'^accounts/login/$', 'django.contrib.auth.views.login'),

のような形にして認証フレームワークを呼び出した場合、認証成功後のリダイレクト先は、テンプレート(templates\registration\login.html)の

> <input type="submit" value="ログイン" /> / <a href="/polls/accounts/regist/">新規登録</a>
> <input type="hidden" name="next" value="/polls" />
                  
 とあるあたりの type="hidden" の value の後ろ(上の例では /polls)

2009年1月23日金曜日

作業メモ

 Django の組み込みのログイン(django.contrib.auth.views.login)を使って login した後のリダイレクト先が変更できない。

 しばらく嵌りそうだ。

2009年1月20日火曜日

作業メモ:django に静的ファイルを読ませるのに嵌る

 最新Pythonエクスプローラ に載っていた Mall プログラムの一部を Django のチュートリアルにあったプログラムに少しずつ移しているのだが、画面周りの CSS を読み込ませるところがうまくいかず嵌る。
 最初は HTML に吐き出されるパスだけを書き換えていたのだが、よく考えると、URL mapper を Django が持っているのだから、Django のソースも何か書き換えが必要になるはず。

 ということで調べてみるとこんなページが。

 結局は Djmall の url.py にあった

if settings.DEBUG:
urlpatterns += patterns('',
(r'^media/(?P.*)$', 'django.views.static.serve',
{'document_root': settings.MEDIA_ROOT}),

を追加したのだが、この処置は開発用とのこと。

 リリースがいつになるかわからないが、忘れないようにせねば。


2009年1月19日月曜日

作業メモ:今日は横から攻める

 class を変更するたびに sqlite のファイルを削除すると途中まで入れたデータも全部消えてしまうので、SQLite ControlCenter 日本語版 なるソフトを見つけてデータベースに直接アクセス。
 テーブル一覧を見ると auth_user というテーブルがあり、中を見ると、登録してあるユーザーの情報が保存してある。これが使えればと、'user = models.ForeignKey(User)' と書いて見るとうまくいく。これで悩みがひとつ解決した。

作業メモ

 Django でのユーザ認証を調べているが、ユーザーの識別は models.User.username しかないみたいだ。id number を振ったりはしないのか。

2009年1月10日土曜日

作業メモ:Django ってすげー、てか

 最新 Python エクスプローラの Django ソース (djmall) を動かしてみた。

 とりあえずデータをひとつだけ入れて、...。

 はでぇ...。

 ソースも数はともかく長さは全部数kbyte。

 なるほどねぇ。LL+フレームワークというのはこういうものか。

作業メモ:


 最新 Python エクスプローラの Django ソース (djmall) を動かそうと Python 2.5.2、Django 0.95.4、pysqlite 2.5.1 をインストール。

 python manage.py syncdb

を実行するとなにやらエラーが出たが終了。

ブラウザで http://localhost:8000/admin を開くとうまくいったが、データの編集をしようとすると

pysqlite2._sqlite.ProgrammingError: You must not use 8-bit bytestrings unless you use a text_factory that can interpret 8-bit bytestrings (like text_factory = str). It is highly recommended that you instead just switch your application to Unicode strings. 


 なるエラーが出る。良く見ると syncdb のエラーも同じ。

text_factory で検索して行くとこんなページこんなページを見つける。
 '.connect(' で Django のソースに検索をかけ、ヒットした数十のなかから C:\Python25\Lib\site-packages\Django-0.95.4-py2.5.egg\django\db\backends\sqlite3\base.py の
 ・先頭付近に import sqlite3
 ・50行目あたりに self.connection.text_factory = sqlite3.OptimizedUnicode
 を追加。

 syncdb では表示が一部文字化けしたが、admin のデータ編集画面は動く。

----
 勘はまだ生きてるかな?

はてなダイヤリーからお引越し

 結構使っている人が多いので何かよいことがあるのだろうと思って、試してみたが(2度目)、HTML は使えないし、アクセス解析もアフェリエイトも貼り付けられないとデメリットばかりで、メリットが見当たらない。編集中に esc を押したらテキストが全部消えてしまうに至って我慢の限界。

 はてなから使い慣れた blogger にお引越し。