1

私のものではない 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 について少し学んだような気がします!

4

2 に答える 2

3

(コメントの返信に基づいて)

実際には、新しいLOCAL_CSS変数をテンプレートに渡しているわけではありません。これは、先に進む前に解決する必要がある問題です。からのいくつかの値はデフォルトでsettings.py利用可能です (例: ) が、これらはで定義されているDjango のデフォルトのコンテキスト プロセッサMEDIA_URLによって追加されます。たとえば、 が利用可能です。TEMPLATE_CONTEXT_PROCESSORS{{ MEDIA_URL }}django.core.context_processors.media

したがって、すべてのページにコンテキスト変数を追加する最善の方法は、カスタム コンテキスト プロセッサです。次のようなもの:

# app/context.py
from django.conf import settings

def local_static(context):
    # Make sure to return a dictionary
    return {
        'LOCAL_CSS': settings.LOCAL_CSS,
        'LOCAL_JS': settings.LOCAL_JS,
    }

# settings.py
TEMPLATE_CONTEXT_PROCESSORS = (
    # ... keep the defaults
    'app.context.local_static'
)
LOCAL_CSS = 'foo'

# template.html
{{ LOCAL_CSS }}
{# should output "foo" #}

これが機能するにRequestContextは、プレーンではなくを使用しContextてテンプレートをレンダリングする必要があります。Djangoのドキュメントは言う:

Django のrender_to_response()ショートカットを使用してテンプレートに辞書の内容を入力している場合、テンプレートにはContextデフォルトで ( ではなくRequestContext) インスタンスが渡されます。テンプレート レンダリングでを使用するRequestContextには、オプションの 3 番目の引数をrender_to_response():RequestContextインスタンスに渡します。

これを行う最も簡単な方法は、実際には代わりに を使用render()render_to_response()することです。

于 2012-08-22T22:46:48.380 に答える
1

OK、このうさぎの穴はかなり深くなっています (これがすべてソートされたら、既存の質問を編集して、一般的に役立つものに回答できることを願っています)。

への相対パス ( など"local.css")os.path.exists()は、 を実行したときのディレクトリに対して相対的に解釈されますrunserver。そのため、os.path.exists('local.css') == Trueそのディレクトリ内ではありますが、デバッグには相対パスを指定する必要がありますmanage.py(または、簡単にするために絶対パスにする必要があります)。

ここで何をするつもりなのかわかりませんtry .. finallyが、おそらく次のようにしてください。

from django.conf import settings
import os

def local_static(context):
    # Make sure to return a dictionary
    return {
        'LOCAL_CSS': '/path/to/local.css' if os.path.exists('/path/to/local.css') else False,
        'LOCAL_JS': '/path/to/local.js' if os.path.exists('/path/to/local.js') else False,
        }

期待どおりに動作することを確認したら、そこから構築します(if os.path.exists()テストを実行しますlocal_settings.py など

于 2012-08-23T23:50:34.440 に答える