読者です 読者をやめる 読者になる 読者になる

IronDjangoでGridViewを使う

Python

 下のエントリで書いたように、Django on IronPython(以下IronDjango)では、django.templateがまだ使えないのですが、そのかわり、templateやnewformsよりもずっと強力な、.NETのSystem.Web.UI.WebControlsが使用可能です。
 IronDjangoが、ここまでできる/これだけしかできないということを紹介するために、ユーザ定義オブジェクトの一覧画面を表示する例を作成してみます。(本家Djangoの能力と比べると非常に貧弱な例ですが・・・)


 まず始めに、モデルを定義します。

# models.py
class Hacker(object):
    __slots__ = ('Name', 'aka', 'Lang')
    def __init__(self, Name, Lang, aka = None):
        self.Name = Name
        self.Lang = Lang
        self.aka = aka or ''

 まだdjango.modelsをサポートできていないので、objectを継承した、ごく普通のモデルを定義しました。
 もし、ORMが必要であれば、iBatis.NETやS2DAO.NETを使って、同様のモデルを定義することが可能だと思います。もちろん、ADO.NETも使えるでしょう。


 次にSystem.Web.UI.WebControlsを使ったUIコンポーネントをpages.pyとして定義しました。

# pages.py
import clr
clr.AddReferenceByPartialName("System.Web")

from System.IO import StringWriter
from System.Web.UI import *
from System.Web.UI.WebControls import *

class GridViewTestPage(object):
    def __init__(self, source):
        self.view = GridView(ID="gv", AutoGenerateColumns = False)
        for k in ('Name', 'aka', 'Lang'):
            self.view.Columns.Add(BoundField(HeaderText=k, DataField=k, ReadOnly=True))
        self.view.DataSource = source
        self.view.DataBind()

    def __str__(self):
        writer = StringWriter()
        self.view.Render(HtmlTextWriter(writer))
        return str(writer)

 本来ならば、System.Web.UI.Pageを継承したPageオブジェクトを作りたかったのですが、ちょと時間がかかりそうなので、GridViewだけを利用しています。
 Visual StudioでフォームをデザインしてIronDjangoで使う、というようなことも可能だとは思いますが、そこまでやるならば、普通にC#VBASP.NETを使うか、ASP.NETIronPythonを組み合わせて使う方が手っ取り早いでしょうね。


 次にviews.pyを定義します。

# iron.hello.views.py
from django.http import HttpResponse
from iron.hello.models import Hacker
from iron.hello.pages import GridViewTestPage

def hello(req):
    page = GridViewTestPage([
        Hacker(Name='Guido van Rossum', Lang='Python', aka='BDFL'),
        Hacker(Name='Matsumoto Hiroyuki', Lang='Ruby', aka='matz'),
        Hacker(Name='Larry Wall', Lang='Perl')
    ])
    return HttpResponse(str(page))

 django.templateを使わずに、上で定義したGridViewTestPageコンポーネントを使用して、応答を返します。表示するデータは、とりあえず固定値としました。


 最後にurls.pyを編集して、URL"/hello/"がiron.hello.viewsのhelloに対応するように指定します。
 開発サーバを起動して、表示を確認してみます。



 見た目を良くするために、上のコードに少し手を入れて、スタイルシートを適用するようにしています。
 まだ、試してはいませんが、GridViewのPagingやHeader, Footerのカスタマイズといったことも容易にできると思います。
 ただ、ASP.NETのデータ・バインディングや、ポストバック・イベントなどを使うとなると、実装上も、またフレームワークとしての一貫性という観点から考えても難しく、結局のところ、Djangoの良さも、.NETのよさも台無しになってしまうだろうと予想しています。


 Djangoの特徴・良さは、MTV(Model, Template, View)にあって、ASP.NETのようなコンポーネント指向のフレームワークとは、やはり相容れない面があると改めて感じました。
 django.newformsが指向しているのは、ASP.NETのコントロールとはちょっと違うものなのではないかと思い始めたのですが、これに関しては余り考えがまとまっていないので、また後日。