daemonfreaks.com

FreeBSD portsのwww/py-django-develのバージョンが上がった

posted by jun-g at Thu, 01 Nov 2007 01:01 JST

FreeBSD portsのDjango開発版のバージョンが、20070525から20071029のスナップショットに上がった。これの対応版みたい。i18n関連の機能はまったく使っていないけど、とりあえず他のアプリもろともportupgradeしておいた。

今回のバージョンアップでSecurityFix以外の変更点ってあるんかな…?とりあえず手元のDjango上で動作している自作のツール類は問題なく動いてるのでホッとした。

Djangoの新規作成の汎用ビューでフォームのデフォルト値を設定したい

posted by jun-g at Sun, 07 Oct 2007 20:32 JST

汎用ビューの勉強がてら、views.pyを一切書かずにツールを作ってみるか、と思って試してみてるんやけど、いきなり躓いた。

作っているツールはちょっとしたメモ用のツールで、画面上、内容と日時を入力するテキストフィールドが表示される。この日時のフィールドにデフォルト値として現在日時を設定しておきたいんやけど、やり方がわからなかった。一応調べたとこまでメモ。

とりあえずdjango.views.generic.create_update.create_objectのソースを読んでみたところ、マニピュレータを自作して、flatten_data()メソッドを実装すれば良さそうな感じがしたので、さらにdjango.db.models.manipulatorsを読んで、モデルクラス内に以下のクラスを追加してみた。

class AddManipulator(models.manipulators.AutomaticAddManipulator):
    def flatten_data(self):
        now = datetime.now()
        return dict(
            rec_time_date = now.strftime('%Y-%m-%d'),
            rec_time_time = now.strftime('%H:%M:%S'))

しかし、ここで定義したクラスはまったく使われていない様子。python manage.py shellを起動して確認してみたところ、モデルのAddManipulatorは<class 'django.db.models.manipulators.AddManipulator'>を参照していたので、自分で定義したAddManipulatorクラスは自動マニピュレータで上書きされているっぽい。

ドキュメント見ても「このビューは、 Django モデルに付属の自動マニピュレータを使います。」って書いてあるしなー…。やっぱり汎用ビューを止めてviews.pyを書いたほうがいいのか…?

Djangoのテンプレートでsettings.pyのMEDIA_URLを参照

posted by jun-g at Tue, 25 Sep 2007 01:36 JST

そういえば静的なコンテンツを一切扱ってなかったなと思い、まず、ドキュメントのmod_python で Django を動かす - メディアファイルの提供を参考にしてApacheの設定を変更。元々/django/以下をdjangoで動くように設定していたので、

<Location "/django/media/">
    SetHandler None
</Location>

とした。後はdjango/media/以下にアプリケーション毎にディレクトリを掘って、その中にメディアファイルを入れればOK。

しかし、テンプレート内の画像タグなんかでURLを全部絶対パスで書いちゃうと可搬性が下がるという問題に気付いた。で、settings.pyにMEDIA_URLっていう設定があった事を思い出したので、それをテンプレートから参照する方法を調べてみたところ、やっぱり同じ事考えている人はいた。

テンプレート上でのMEDIA_URL呼び出しについて その2 | pythonでつくるskyfish開発ブログ

上記ページのeveresさんのコメントを参考にsettings.pyに、

from django.conf import global_settings
TEMPLATE_CONTEXT_PROCESSORS = \
    global_settings.TEMPLATE_CONTEXT_PROCESSORS + (
    'myproject.context_processors.media',
    )

を追加。で、Djangoプロジェクト直下にcontext_processors.pyを作成し、その中に、

from django.conf import settings
def media(request):
    return {'MEDIA_URL': settings.MEDIA_URL}

と書いた。generic viewsを使っているので、以上でテンプレート内で{{ MEDIA_URL }}と書けるようになった。自前のviewsを使用している場合はcontextにRequestContextを指定しないといけないようなので、忘れないようにしよう。

そういえばドキュメントのコンテキストのサブクラス: RequestContextで、TEMPLATE_CONTEXT_PROCESSORSの値のデフォルトは

("django.core.context_processors.auth",
"django.core.context_processors.debug",
"django.core.context_processors.i18n",
"django.core.context_processors.media")

になっている、と書かれているけど、自分の環境ではdjango.core.context_processors.mediaという値は含まれていなかったし、実際django/core/context_processors.pyの中にはmediaという関数は存在しなかった。バージョンが違うからかな…?

Djangoを使ってみてる その2

posted by jun-g at Sun, 23 Sep 2007 20:54 JST

チュートリアル通り進めた場合、チュートリアルその3のURLconf の脱カップリングで行った内容だけだとDjangoアプリケーションの切り離しは出来ない。何故ならviews.pyに

from mysite.polls.models import Poll

と書いてしまっているから。これだとmysite以外のプロジェクト内に移動した場合にコードの修正が発生してしまう。完全に切り離すには、

from polls.models import Poll

と書かなければならないと思う。チュートリアルその4まで見たけどこの事についてはどこにも触れられていないっぽい。誰でもすぐ気付くからかな?

ちなみに、Django付属の開発用サーバではimport文を上記のように書き換えてもそのまま動くけど、Apache+mod_python上ではPythonPath上にpolls.modelsが見つからない、というエラーになった。ドキュメントのmod_python で Django を動かすには、DjangoプロジェクトおよびDjangoアプリケーションそれぞれの親ディレクトリをPythonPathに含める必要がある、と書いてあった。なので例えば/home/jun-g以下にチュートリアル通りの以下のようなディレクトリ構成で配置した場合、

mysite
  |
  +-- polls

PythonPathには以下のように書く必要がある。

PythonPath "['/home/jun-g', '/home/jun-g/mysite'] + sys.path"

っていうポイントにちょっとだけ引っかかった。

後、作成した自分用のアプリの入力フォーム生成とデータのバリデーションをnewformsを使うように修正した。泥臭いコードがかなり減ったけど、もうちょっと適切なWidgetを適用すればまだまだ整理できそうな感じ。そういえば、ドキュメントにoldformsの事は知らなくて良い、と書かれていたので、oldformsには一切触れず。

あ、generic viewsもmiddlewaresもまだ全然触っていない。これは次のアプリで使ってみることにしよう。後、動作環境をApache+mod_wsgi上に移す、とかもやりたい。

Djangoを使ってみてる

posted by jun-g at Fri, 21 Sep 2007 13:07 JST

個人的なメモツールをいくつか作る必要があったので、勉強がてらDjangoでひとつ作ってみた。DjangoはFreeBSD portsのwww/py-django-develからインストールした。バージョンは2007/05/25あたりのスナップショットみたい。

とりあえず最初はチュートリアルを見ながら始めた。で、だらだらやってた割にすぐできた。やっぱり和訳ドキュメントが揃ってると便利やなぁ。でも、すぐ出来ただけあってとりあえず動きました的な実装になってしまったので、まだまだ改善の余地有り。formsとかgeneric viewsとか全く使ってないし。

そういえばなんか時間が-9時間ずれてしまって、ちょっとだけハマった。原因はsettings.pyのTIME_ZONEに「Asia/Tokyo Japan」と書いてしまっていたから。正しくは「Asia/Tokyo」だけで良いみたい。settings.pyに載っていた参考URLのこのページには「Japan」まで書かれてたから、その通り書いただけなんやけどな…。

Apache+mod_pythonで動かす為の環境構築まで完了したので、コードをちょっとづつ修正していくか。