web-dev-qa-db-ja.com

Django:メディア/スタイルシートを提供し、テンプレート内でそれらにリンクする方法

この質問のバリエーションが求められていますが、テンプレートのレンダリング時にスタイルシートを正しくロードすることができません。

私は開発中にDjangoプロセスから静的メディアを提供しようとしています-これは本番環境では強く推奨されていません、私は承知しています。私がどこに間違っているのかを理解するのに役立ちます。

DjangoプロジェクトのWebサイトの例に従ってみましたが、テンプレートからスタイルシートを参照する方法については触れていません。また、さまざまなバリエーションを試しました同じことなので、私のコード/設定は説明されているものから少し外れているかもしれません。

settings.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/で開きます。これは私を混乱させたと思います。

43
Josh Smeaton

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

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"
51
Ty.

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

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

11
Meir Kriheli

DjangoはCSS/JavaScriptファイルを提供していないため、私は通常、独自のテンプレートシンプルタグを作成します。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変数を追加することもできます。

6
bchhun

絶対命名を使用しています。サイトを深いパスで実行している場合を除き(または実行している場合でも)、..そして次のようなものに行きます:

<link rel="stylesheet" type="text/css" href="/media/styles.css">
2
Oli

すぐにチャイムが鳴ると思いました。ここでの提案はすべて正常に機能しますが、開発中にTyの例を使用しますが、本番環境に到達したら、Apacheを直接使用するか、使用している他のサーバーでファイルを提供することを選択できます。

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

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

これを行う理由は2つあります。 1つ目は、不要なときにDjangoこれらのリクエストを処理する方が遅いようです。2つ目は、ほとんどのブラウザが2つ目のサブドメインを使用して3つの異なるドメインから同時にファイルを同時にダウンロードできるため、静的ファイルのドメインは、ユーザーのダウンロード速度を実際に高速化します。

1
David

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

末尾のスラッシュを使用し、これがMEDIA_URL設定と異なるようにしてください(同じURLを2つの異なるファイルセットにマッピングできないため)。

http://docs.djangoproject.com/en/dev/ref/settings/#admin-media-prefix から

第二に、ファイルシステム上のディレクトリをURLパスと混同している可能性があります。絶対URLを使用してみて、絞り込みます。

1
sykora

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

0
datashaman