2009-11-28 25 views
5

私は幾分大きなプロジェクトを構築しています。これは基本的に次のもので構成されています。Django、モデルなしで管理パネルを生成する方法は?

サーバー1: アイスベースのサービス。 セッション処理のためのGlacier2。 Glacier2へのアクセスを許可するファイアウォール。

サーバー2: Glacier2経由のIceサービスのWebインターフェイス(読み取り、公開)。 氷河2を経由してアイスサービスの管理インターフェース。

私が関心を持っているのはウェブインターフェースです。 DjangoはPythonで書かれていて、非常に便利な自動管理パネルジェネレータを持っているので、私はDjangoを使いたいです。

Webインターフェイスはどのデータベースにもアクセスしません。 Glacier2ルータ経由でサーバー#1のIceサービスに接続し、これらのサービスによって公開されているAPIを使用してデータを操作します。

おそらくあなたが知っているように、Djangoの管理者の生成はDjangoのORMの使用に依存しています。私はアクセスするデータベースがないので使用しません。

私はadminパネルを生成する必要がありますが、ORMのような標準的なデータアクセスをする代わりに、「db-access」コールをインターセプトしてIceサービスコールに変換してからサービスの出力(存在する場合)は、ORMが通常返したものに変換し、制御をDjangoに返します。

どのようにすればいいのですか?私はサブクラス化する必要がありますか?任意の具体的なアイデアですか?

お時間をいただきありがとうございます。

答えて

7

は、私はあなたが欲しい管理の統合を取得するには、カスタムORMSを書くよりも簡単な方法があるかもしれないと思う互換性のあるものdjango.model多くのことを行う必要があります。私はコントロールパネルのAPIを介してWebfaction電子メールアカウントを管理することができますアプリでそれを使用しました。

models.py、admin.py、およびurlsをご覧ください。PYここ:django-webfaction

= Falseの

登録管理者とモデルその管理しているダミーモデルを使用して、管理インデックスページでエントリを作成します。

これで、管理者のURLをインターセプトし、自分のビューに誘導することができます。

これは、管理者が提供する追加/編集/削除操作があなたのアプリにとって理にかなっている場合に意味があります。それ以外の場合は、管理インデックスまたはチェンジリストテンプレートを上書きして、独自のカスタムアクションを組み込むことをお勧めします。

+0

私はあなたのアプリをダウンロードしました。私は一般的な実装が好きです。 アカウント(認証、ユーザー、グループ、権限)、設定(すべてのサービス、Webインターフェイス)、ログ管理パネルの[最近の操作]と同じではなく、すべてのユーザーがアクションを記録します)、ジョブ(他のサービスのキュー)、およびまだ設計されていない面白いことをする実際のサービス。 したがって、9/10では、追加/編集/削除アクションセットが保持されます。その1/10のために、私はあなたのアプリのようにいつも自分のカスタマイズしたページを生成することができます。 – user168833

+0

+1のために 'managed = False' – Don

0

django ORMにはプラグイン可能なバックエンドがあります。つまり、RDBMS以外のものに対してバックエンドを書くことができます。これはおそらくかなり大きな仕事ですが、始めにはMalcolm TredinnickのDjangoCon 2008、Inside the ORMの講演が参考になります。

そうしないと、ORMを完全に回避し、必要なアクセスに対して手動でフォームを書き込むことができます。

3

contrib.adminの本当の力はdjango Formsです。本質的には、管理ツールは基本的に、モデルをurls.pyルーティングを少し入れてモデルを一致させるためにフォームを自動的に生成しています。結局、管理ツールとは別にdjangoフォームを使用する方が簡単でしょう。

+0

+1。彼は、あなたが提供したURLからサンプルコードを取得し、それを得て、それを彼の目的に適応させるべきです。 – steveha

+0

リンクしたドキュメントを確認します。 – user168833

1

あなたが「モック」いくつかのクラス、それはモデルのように見えるが、それはあなたのAPIへのプロキシを行いますので、

f.e.することができます

class QuerysetMock(object): 
    def all(): 
     return call_to_your_api() 
    [...] 


class MetaMock(object): 
    def fields(): 
     return fields_mock_objects.. 
    verbose_name = '' 
    [...] 

class ModelMock(object): 
    _meta = MetaMock() 
    objects = QuerysetMock() 

admin.site.register(ModelMock) 

これは動作するかもしれ..しかし、あなたは

関連する問題