2016-04-13 5 views
6

Djangoプロジェクトでは、テンプレートに静的ファイルをインクルードしたいと考えています。以下は、プロジェクト構造である:私はそれをどのように行うのですdjango:テンプレートにスタティックファイルを含めるには?

{% load staticfiles %} 
... 

{% include {% static 'main/js/main.js' %} %} 

news.html

proj/ 
    main/ 
     static/ 
     main/ 
      js/ 
       main.js 
    news/ 
     templates/ 
     news/ 
      news.html 

、私は次の架空の形式でmain.jsを含めたいですか?

+0

なぜ投票が下りましたか? **広すぎる**のため、質問を閉じることを提案しましたか?それは気違いです!この質問は非常に具体的です:静的なファイルを含めることができるように、2つのテンプレートタグ 'include'と' static'をどのようにして統合しますか? –

+0

[努力が必要ですか?](http://meta.stackoverflow.com/q/288176/1324033) - > "作業指示書"には "広すぎる"というフラグを付ける必要があります。 – Sayse

+1

テンプレートに静的ファイルを含めることはあまり一般的ではありません。あなたが解決しようとしている問題が本当に正しい解決策であると確信していますか? TEMPLATE_DIRSにあなたのSTATIC_ROOTを含めたり、静的ファイル用の独自のテンプレートローダーを作成するなどの回避策がありますが、これは奇妙なことです。後であなたを噛んでしまうかもしれません。 – koniiiik

答えて

1

私はいくつかのアイデアを持っています。

filesystem loaderを有効にして、TEMPLATES[0]['DIRS'](以前はTEMPLATE_DIRS)に静的ファイルを含む関連ディレクトリを含めることが最も簡単です。あなたがインストールしたアプリケーションの中に含まれている静的ファイルは、DIRSにリストされていない限り自動的には取り込まれないという警告があります。別のオプションはSTATIC_ROOTを使用することですが、通常は開発中に行う必要のない静的ファイルを変更するたびにcollectstaticを実行する場合にのみ有効です。もう一つの落とし穴は、CDNを使用したり、静的ファイルを別のホスト/ネットワーク/任意の場所にホストしたりするのではなく、ローカルの静的ストレージでのみ機能するということです。

他にも、スタティックファイルを使用してスタティックをテンプレートとして読み込む独自のテンプレートローダーを作成することができます。これはもう少し複雑ですが、格納方法や使用方法に関係なく静的ファイルにアクセスできるはずです。

どちらのオプションを選択する場合でも、注意する必要があります。たとえば、テンプレートとして含める静的ファイルが、HTMLやその他のコンテキストに含めることが安全であることを保証する必要があります。エスケープされることはありません。

クライアントが要求するリクエストの数を最適化しようとしている場合は、より良い方法があります。あなたは、静的ファイルを前処理して圧縮するいくつかのパイプラインを実装する方がよいでしょう。 CSS/JSの重要な部分をHTMLに含めることで、クライアントがキャッシュを活用することが不可能になり、同じ静的コンテンツを何度も繰り返しダウンロードして、パフォーマンスに悪影響を及ぼす可能性があります。

編集:動的JavaScript変数を含めるだけで、静的ファイルではないので、本当に必要なのは、JavaScriptコードを含むテンプレートを作成し、テンプレートとして静的ファイルを処理することを邪魔しないことです。すべてのjavascriptが静的なファイルである必要があると言うルールはありません。動的な場合は、静的なファイルではありません。

記録的には、これはXY problemの典型的なインスタンスでした。問題Xは、テンプレートをレンダリングするときにJavaScript変数に値を動的に割り当てていました。あなたは、潜在的な解決策としてテンプレートに静的ファイルを含めることを考え出しましたが、テンプレートに静的ファイルを含める方法がわからないという問題Yに悩まされました。

+0

良い説明。ポイントまでまっすぐ。 –

3

includeディレクティブは、テンプレートディレクトリ内のファイルのみを検索します。あなたができることは(私はしませんが)静的なファイルも含めて設定を変更することです:

TEMPLATE_DIRS = [ 
    ... 
    "path/to/your/statics", 
]