私のものではない django プロジェクトに取り組んでいますが、webapp にローカルの css/js オプションを追加しようとしています。
settings_local.py にこれを追加しました:
if os.path.exists('templates_local/local.css'):
LOCAL_CSS = True
logging.debug('LOCAL_CSS: %s' % LOCAL_CSS)
else:
LOCAL_CSS = False
if os.path.exists('templates_local/local.js'):
LOCAL_JS = True
logging.debug('LOCAL_JS: %s' % LOCAL_JS)
else:
LOCAL_JS = False
これは機能しているようです(以下を参照)。メインのテンプレートに追加しました
{% if LOCAL_CSS %}
{% compress css %}
{% include "../templates_local/local.css" %}
{% endcompress %}
{% endif %}
(プロジェクトは django-compressor を使用します)。
これは、local.css ファイルが存在する場合は期待どおりに機能しますが、ファイルが存在しない場合はエラーが発生します。
レンダリング中に TemplateDoesNotExist をキャッチ: ../templates_local/local.css
スタック トレースでは、LOCAL_CSS が False としてリストされています。残念ながら、スタック トレースはダウンして、IF がファイルを見つけられないことを示しています (これは予想されることです) が、IF がどのように評価されたかは含まれていないようですが、True と評価されているかのように実行されています... 、何が問題なのかを理解するのに役立ちません。
if LOCAL_CSS == True
また、変数が存在するという理由だけで上記の if ステートメントが True として評価される場合に、明示的にチェックしようとしました。
いずれにせよ、これが私がこれまで django について見逃していた奇妙な詳細であるか、またはより経験のある人が私が間違ったことをすぐに理解できるものであることを願っています。
私がこれを間違った方法で行っていると思われる場合は、質問者がいなかった私の元の質問を自由に読んでください: https://stackoverflow.com/questions/11975054/django-recipe-for-local-css-and- local-js-like-settings-local-py-for-app-with-m
答えた!- 3つの別々の問題
よくあることですが、複数のミスステップはより単純な単一の問題のように見えました
最終的に機能したのは、実際には非常に単純でした。
supervacuoの提案といくつかの論争の後、コンテキスト プロセッサ、templates_local/context.py を追加しました。
import os.path
install_dir = os.path.normpath(os.path.join(os.path.dirname(__file__), '..'))
localcss = os.path.join(install_dir, 'templates_local', 'local.css')
localjs = os.path.join(install_dir, 'templates_local', 'local.js')
def local_static(context):
return {
'LOCAL_CSS': localcss if os.path.exists(localcss) else False,
'LOCAL_JS': localjs if os.path.exists(localjs) else False,
}
"rooibos.templates_local.context.local_static",
settings.py ファイルの既存の TEMPLATE_CONTEXT_PROCESSORS リストに追加されます。
テンプレートの if ステートメントを if not に切り替える必要がありました。
{% if LOCAL_CSS != False %}
{% compress css %}
{% include LOCAL_CSS %}
{% endcompress %}
{% endif %}
何が悪かったのか?
問題 1 - テンプレート コンテキストで利用できるものについて混乱していた
supervacuo の最初の提案を参照してください
問題 2 - 環境に関する経験/知識の欠如
os.path.exists() のようなメソッドの django のコンテキストでは、呼び出し元の path/file.py ではなく、manage.py の場所から実行されることを私は知りませんでした (これは後知恵)
問題 3 - ロジックに欠陥がある、アプローチが単純すぎる、別の可能性がある
ファイルが存在しない場合、エラーを発生させずにTEMPLATE_DEBUG = True
パス文字列 (例: ) を含めることができない場合があると思われます。{% include "../templates_local/local.css" %}
しかし、とにかく、現在の動作方法 (ファイルが存在することを確認し、絶対パスまたは False をテンプレート変数として保存する方法は、より堅牢なソリューションのように見え、テンプレートでより読みやすくなります。
supervacuo に再び感謝します。あなたの提案とコメントは本当に有益でした。それらのおかげで、django について少し学んだような気がします!