Djangoで手軽にCSRF対策する | Top | DreamsHostのDjango問題解決法

 

多重継承はすんなり出来そう

Modelの継承の話だと思った人はごめんなさい。

models.Modelと別のニュースタイルクラスを多重継承して、実際のModelクラスを作るというだけの話。
職業Javaプログラマだから多重継承慣れしていないのです。



PHPで多重継承をお探しの方へ。PHPでは実験的ステータスで「オブジェクトの合成関数」があるようです。
Rhaco1.0.1を使うと、オブジェクトの合成をmixinという手法で行うことができます。RhacoはPHP4/5で動作するフレームワークです。

ことの発端

中国で、Django製のBlogが公開されました。
これが、ちょっとDjangoらしからぬ作りなわけです。あれがDjangoの書き方だと思われると、ちょっとよろしくない(私にもいろいろと覚えがあるコードの書き方が多いので、しばらくすれば古い考えに縛られていることに気づくでしょうが)。


他にも思うところもあり、Djblogkitを改良して「比較的簡単に関連コンテンツのモデルを定義できて、関連コンテンツ同士をひもづける。一応UIはAjaxを使う」ものを作ろうという訳です。


で、関連コンテンツの関連コンテンツたる部分を共通化&利用する関連コンテンツの種別判別に多重継承を使っています。関連コンテンツの枠組み自体は、Djangoがビルトインでもっているコンテンツタイプというものを使うのですが、OneToManyでの利用例しか見かけません。


いくつかもメモ

content_type_idからモデルクラスを取得して、特定のクラスのサブクラスであることを検証する

def is_relatable(field_data, all_data):
    """ForeignKeyField(ContentType, validator_list=[is_relatable])とすれば、管理インターフェースでも、汎用ビューでも、AutomaticManipulatorを使う限りは自動で検証されます。
    """
    c = ContentType.objects.get(pk=field_data).model_class()
    if not issubclass(c, RelatedModelBase):
        raise ValidationError, _("You must select Only Relatable Model(%s isn't)" % c._meta.object_name)

ContentTypeから取り出したモデル情報からデフォルトマネージャを利用する

main_object_class = ContentType.objects.get(pk=content_type_id).model_class()
main_object = main_object_class._meta.admin.manager.get(pk=object_id)


実のところ

「スパムとか」はコンテンツタイプを既にManyToManyで使っています。ただし、使うのは自分自身なので作り込んでいません。


Taged with:,,,

Entry Date:2006-12-19 02:42

Author:makoto

ping url:http://www.everes.net/2006/dec/19/django-multiple-inheritance/tbping/

subscribe:feed with LDR

Add Comment

コメント追加








What's Next
Tags
Blog Archive
Project
  • » WorkStyle

    作り直し中なので、見ないでっ!

  • » pymagnolia

    ma.gnolia.comのAPIを操作するPythonライブラリ。

  • » django-ja

    Djangoと日本の仲間たち。
    Djangoに関するニュースや、「仲間たち」のブログエントリをアグリゲートしています。

  • » rhaco

    PHPのWebフレームワーク。 PHPらしさを失わず直感的に記述できることを目指している。 Djangoと同じく、他のライブラリに依存しない。また、Djangoっぽいテンプレートの作り方も可能。

  • » Tracka

    スモールチーム、家族用の知共有ウェブアプリケーション。
    テキスト、画像、youtube動画、stage6動画等をトラック!

  • » BMO

    BMOは、本、CD、DVD、ゲームに印刷されているバーコードをiSightで読み取り、AmazonのAPIを利用して画像や情報をmacに保存します。iSightのついているmacで利用してください。Leopardと呼ばれているOSX 10.5以上が必要です。 保存した情報は、OSX Leopard(10.5)から搭載されたCover FlowとQuick Lookという仕組みを利用して表示します。