45

この質問のバリエーションが尋ねられましたが、テンプレートがレンダリングされたときにスタイルシートを正しくロードできません。

開発中に Django プロセスから静的メディアを提供しようとしていますが、これは本番環境では強く推奨されていません。構成とテンプレートを投稿します。うまくいけば、誰かが私が間違っている場所を理解するのを手伝ってくれることを願っています.

Django プロジェクト Web サイトの例に従おうとしたことに注意してください。ただし、テンプレートからスタイルシートを参照する方法については言及されていません。また、同じことのさまざまなバリエーションを試したので、私のコード/設定は説明されているものから少しずれている可能性があります.

設定.py

MEDIA_ROOT = 'D:/Dev Tools/django_projects/dso/media'
MEDIA_URL = '/media/'
ADMIN_MEDIA_PREFIX = '/media/'

urls.py

from django.conf.urls.defaults import *
from django.conf import settings
from django.contrib import admin

admin.autodiscover()

urlpatterns = patterns('',
    (r'^admin/(.*)', admin.site.root),
    (r'^ovramt/$', 'dso.ovramt.views.index'),
)

if settings.DEBUG:
    urlpatterns += patterns('',
        (r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT}),
    )

私のテンプレート内:

<head> 
<title> {% block title %} DSO Template {% endblock %} </title> 
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" >
<link rel="stylesheet" type="text/css" href="../media/styles.css">
</head>

ファイル (テンプレート/メディア) はファイル システムの正しいディレクトリにあることを保証します。提供する必要がある追加情報がある場合は、コメントを投稿してください。


編集:

私が抱えていた問題の 1 つは、リンクの先頭に「/」を使用することでした。スラッシュが先頭に追加されている場合、リンクはサイトのルートから開かれます。スラッシュがない場合、リンクは現在のレベルで開かれます。例:

www.example.com/application/ にはリンク "/app2/" とリンク "app3/" があります
。app2 は www.example.com/app2/ で開き、app3 は www.example.com/application/app3/ で開きます。これは私を混乱させたと思います。

4

7 に答える 7

51

私はこれを自分で理解する必要がありました。

settings.py:

MEDIA_ROOT = 'C:/Server/Projects/project_name/static/'
MEDIA_URL = '/static/'
ADMIN_MEDIA_PREFIX = '/media/'

urls.py:

from django.conf import settings
...
if settings.DEBUG:
    urlpatterns += patterns('',
        (r'^static/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT}),
    )

テンプレートファイル:

<link rel="stylesheet" type="text/css" href="/static/css/style.css" />

ここにあるファイルで:

"C:/Server/Projects/project_name/static/css/style.css"
于 2009-01-15T18:56:51.770 に答える
11

Django にはすでに MEDIA_URL のコンテキスト プロセスがあります。 Django のドキュメントを参照してください。

これはデフォルトで (CONTEXT_PROCESSORS をカスタマイズして追加するのを忘れていない限り) RequestContext で利用できるはずです。

于 2009-01-26T10:49:00.467 に答える
6

Django は CSS/JavaScript ファイルを提供していないため、通常は独自の Template シンプル タグを作成します。Apache がそれを行うので、私のメディア URL は通常http://static.mysite.comです。

yourApp/templatetags/media_url.py:

from django.template import Library
from yourapp.settings import MEDIA_URL
register = Library()

@register.simple_tag
def media_url():
    return MEDIA_URL

そして私のテンプレートファイルでは:

{% load media_url %}
<link href="{{ media_url }}css/main.css" rel="stylesheet" type="text/css">

独自のコンテキスト プリプロセッサを作成して、すべてのテンプレートに media_url 変数を追加することもできます。

于 2009-01-15T18:40:22.227 に答える
2

私は絶対的な命名を使用しています。サイトを深いパスで実行していない限り (または実行している場合でも)、私はをやめ..て次のようなものを選びます:

<link rel="stylesheet" type="text/css" href="/media/styles.css">
于 2009-01-15T09:27:23.293 に答える
1

私はいくつかのアイデアを持っていますが、どれが私のために働いているのかわかりません:)

必ず末尾のスラッシュを使用し、これを MEDIA_URL 設定とは異なるものにしてください (同じ URL を 2 つの異なるファイル セットにマップすることはできないため)。

それはhttp://docs.djangoproject.com/en/dev/ref/settings/#admin-media-prefixからのものです

次に、ファイルシステムのディレクトリと URL パスを混同している可能性があります。絶対 URL を使用してみてから、それらを絞り込んでください。

于 2009-01-15T09:15:37.060 に答える
1

すぐに声をかけようと思っただけです。ここでの提案はすべて問題なく機能し、開発中に Ty の例を使用していますが、本番環境に到達したら、ストレート Apache または使用している他のサーバーを介してファイルを提供することを選択することをお勧めします。

私がしていることは、開発が完了したらサブドメインをセットアップし、すべてのリンクを静的メディアに置き換えることです。例えば:

<link rel="stylesheet" type="text/css" href="http://static.mydomain.com/css/style.css" />

これを行う理由は 2 つあります。まず、Django がこれらの要求を必要としないときに処理するのが遅くなるように思われます。次に、ほとんどのブラウザは実際には 3 つの異なるドメインからファイルを同時にダウンロードできるため、静的ファイルに 2 つ目のサブドメインを使用すると、ユーザーのダウンロード速度が実際に速くなります。

于 2009-01-20T15:04:57.437 に答える
0

追加するもう1つのことは、サブドメイン/異なるドメインに別のメディアサーバーがある場合、静的メディアのCookieを無効にできることです. 処理と帯域幅を少し節約します。

于 2010-08-10T16:51:58.710 に答える