Django:メディア/スタイルシートを提供し、テンプレート内でそれらにリンクする方法
-
22-07-2019 - |
質問
この質問のバリエーションは尋ねられましたが、テンプレートがレンダリングされるときにスタイルシートを正しくロードすることができません。
私は開発中に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/
テンプレート内:
<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/にはリンク&quot; / app2 /とリンク&quot; app3 /&quot;があります。
app2はwww.example.com/app2/で開き、app3はwww.example.com/application/app3/で開きます。これは私を混乱させたと思います。
, 'dso.ovramt.views.index'),
)
if settings.DEBUG:
urlpatterns += patterns('',
(r'^media/(?P<path>.*)
テンプレート内:
<*>
ファイル(テンプレート/メディア)がファイルシステムの正しいディレクトリにあることを確認します。追加情報が必要な場合は、コメントを投稿してください。
編集:
私が抱えていた問題の1つは、リンクの先頭に「/」を付けることでした。スラッシュが付加されている場合、リンクはサイトのルートから開かれます。スラッシュがない場合、リンクは現在のレベルで開かれます。例:
www.example.com/application/にはリンク&quot; / app2 /とリンク&quot; app3 /&quot;があります。
app2はwww.example.com/app2/で開き、app3はwww.example.com/application/app3/で開きます。これは私を混乱させたと思います。
, 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT}),
)
テンプレート内:
<*>ファイル(テンプレート/メディア)がファイルシステムの正しいディレクトリにあることを確認します。追加情報が必要な場合は、コメントを投稿してください。
編集:
私が抱えていた問題の1つは、リンクの先頭に「/」を付けることでした。スラッシュが付加されている場合、リンクはサイトのルートから開かれます。スラッシュがない場合、リンクは現在のレベルで開かれます。例:
www.example.com/application/にはリンク&quot; / app2 /とリンク&quot; app3 /&quot;があります。
app2はwww.example.com/app2/で開き、app3はwww.example.com/application/app3/で開きます。これは私を混乱させたと思います。
解決
これを自分で把握する必要がありました。
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>.*)
テンプレートファイル:
<link rel="stylesheet" type="text/css" href="/static/css/style.css" />
ファイルは次の場所にあります:
"C:/Server/Projects/project_name/static/css/style.css"
, 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT}),
)
テンプレートファイル:
<*>ファイルは次の場所にあります:
<*>他のヒント
DjangoにはすでにMEDIA_URLのコンテキストプロセスがあります。 Djangoのドキュメント。
RequestContextでデフォルトで利用可能になります(CONTEXT_PROCESSORSをカスタマイズして追加するのを忘れていない限り)。
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変数を追加します。
絶対命名を使用しています。あなたが深い道でサイトを運営しているのでなければ(あるいはあなたがそうであったとしても)、私は ..
をドロップして、次のようなものに行きます:
<link rel="stylesheet" type="text/css" href="/media/styles.css">
いくつかのアイデアがありますが、どれが私のために働いているのかわかりません:)
末尾のスラッシュを使用し、これがMEDIA_URL設定と異なるようにしてください(同じURLを2つの異なるファイルセットにマッピングできないため)。
http://docs.djangoprojectからのものです。 com / en / dev / ref / settings /#admin-media-prefix
第二に、ファイルシステム上のディレクトリをURLパスと混同している可能性があります。絶対URLを使用してから、絞り込みます。
ただちにチャイムを鳴らすと思った。ここでの提案はすべて正常に機能しますが、開発中にTyの例を使用しますが、本番環境に到達したら、まっすぐなApacheまたは他のサーバーを使用してファイルを提供することを選択できます。
私がしているのは、開発が完了したらサブドメインを設定し、静的メディアへのすべてのリンクを置き換えることです。例えば:
<link rel="stylesheet" type="text/css" href="http://static.mydomain.com/css/style.css" />
これを行う理由は2つあります。まず、Djangoがこれらの要求を必要としないときに処理するのが遅いようです。第二に、ほとんどのブラウザは実際に3つの異なるドメインから同時にファイルをダウンロードできるため、静的ファイルに2番目のサブドメインを使用すると、実際にユーザーのダウンロード速度が向上します。
もう1つ追加することは、サブドメイン/異なるドメインに別個のメディアサーバーがある場合、静的メディアのCookieを無効にできることです。処理と帯域幅を少し節約します。