2012-02-25 17 views
3

私はDjangoを初めて使い、サードパーティのアプリケーションがどのように統合されているかについてかなり混乱しています。 DRYの私の(おそらく素朴な)解釈では、私自身のコードだけでなく他の人のコードもコピー/貼り付けを最小限に抑えたいので、たとえばcontrib.authをほとんど黒として使うというパターンに満足していますauth.Userに関する追加情報が必要だった場合(UserProfileオブジェクトまたは継承でauth.Userを拡張することによって)そして、これは私がほとんどのサードパーティーのアプリを使うことを想像したものでした。サードパーティのdjangoアプリケーションとテンプレートを統合

しかし、これは非常に困難であることがすぐに分かったので、私は、プロジェクトフォルダ内にあるサードパーティのすべてのアプリケーションの「コピー」を、基本的には最小限の変更でコピー全体にすることをやめました。最終的なストローは私が基本的なブログ(私はdjango-basic-blogに定住した)を追加したいだけで、単一のテンプレートを変更する必要がありました。私はプロジェクトの中でそのアプリケーションのコピーを単一のテンプレートが変更されました。

私の質問:私はちょうど単一のテンプレートを変更する必要があり、この特定のケースでは

  • 、これは私ができる最善の(アプリケーション全体をコピー)ですか?私がただ一つのモデルを変更する必要があったなら、サードパーティーのアプリケーションを尊重して尊重し、自分のアプリでモデル継承を行うことができます...
  • 一般に、私のプロジェクトの下でアプリケーションをコピーし、小さなビットは狂って無駄で汚れているように感じます。頻繁に更新されるサードパーティのアプリを使用している場合、変更を同期させるのは苦痛になるような気もします。私はちょうど爆弾を愛することを学ぶべきか、いくつかの明白な建築パターン/ Djangoが提供した援助は私が行方不明ですか?

答えて

5

変更を追跡するのが難しく、多くのプロジェクトにコピーされた同じコードの混乱が生じるため、サードパーティ製モジュールのコードを変更しないでください。典型的な解決策は、プロジェクトのディレクトリではなく、各サードパーティ製モジュールのバージョンをPythonパスに1つだけ持つことです。この単一のパッケージは、すべてのプロジェクトで再利用できます。

テンプレートごとに異なるアプローチが必要ですが、プロジェクトごとに変更する必要があることがよくあります。だからDjangoにはsettings.TEMPLATE_DIRSsettings.TEMPLATE_LOADERSが付属しています。

TEMPLATE_DIRSテンプレートファイルを含むディレクトリのリストを指定します。 TEMPLATE_LOADERSには、テンプレートの読み込みに使用するクラスを指定します。ローダーは、定義された順序で使用され、ディレクトリーは定義された順序でトラバースされます。したがって、プロジェクトのディレクトリ内のテンプレートを最初に検索し、他のモジュールではフォールバックとして検索することができます。

基本的に、1つのテンプレートを変更するために、Pythonモジュール全体をコピーする必要はありません。そのサードパーティ製モジュールのテンプレートディレクトリだけをコピーするか、変更したいテンプレートだけでもコピーしてください。適切な場所に配置して追加する場合は、TEMPLATE_DIRにDjangoのパスを使用してください。

+0

ああありがとうございました。それは私の最初の質問に完全に答えます。 – yanzhang

+0

あなたの回答から、コードを明示的に変更せずに第三者モジュールを使用する方法がほとんど常にあることを暗示しているようです。私はあなたがテンプレートについて私に教えてくれたことを推測しようと思います。それは、サードパーティーのすべてのアプリケーション "TheirApp"のようです。私はTheirAppからモデルとビューをインポート/拡張する "MyApp" TEMPLATE_LOADERSで注文が正しいことを確認して、TheirAppとMyAppの両方を設定に追加します。これは正しいパターンですか? – yanzhang

+0

あなたのプロジェクトには通常、テンプレートがあるところに「/ templates」ディレクトリがあります。そこにサードパーティのテンプレートを入れてください。 –

関連する問題