45 Stimmen

Django: Wie servieren Sie Medien / Stylesheets und verlinken sie innerhalb von Vorlagen?

Versionen dieser Frage wurden bereits gestellt, aber ich kann meine Stylesheets immer noch nicht richtig laden, wenn meine Vorlagen gerendert werden.

Ich versuche, statische Medien aus dem Django-Prozess während der Entwicklung zu servieren - was in der Produktion dringend abgeraten wird, ich bin mir dessen bewusst. Ich werde meine Konfiguration und meine Vorlage posten, und hoffentlich kann mir jemand helfen zu verstehen, wo ich mich vertue.

Beachten Sie, dass ich versucht habe, dem Beispiel auf der Django-Projektwebsite zu folgen, jedoch nicht erwähnt wird, wie man in einer Vorlage auf seine Stylesheets verweist. Ich habe auch viele verschiedene Variationen desselben Dinges ausprobiert, daher kann mein Code/Einstellungen ein wenig anders sein als das Beschriebene.

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.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT}),
    )

Innerhalb meiner Vorlage:

 {% block title %} DSO Vorlage {% endblock %}  

Ich versichere Ihnen, die Dateien (Vorlagen/Medien) befinden sich im richtigen Verzeichnis auf meinem Dateisystem. Wenn ich weitere Informationen bereitstellen muss, bitte posten Sie einen Kommentar.


Bearbeiten:

Eins der Probleme, die ich hatte, war die Verwendung eines '/' vor meinen Links. Wenn der Schrägstrich vorangestellt ist, wird der Link von der Wurzel der Website geöffnet. Wenn kein Schrägstrich vorhanden ist, wird der Link auf aktueller Ebene geöffnet. Ein Beispiel:

www.beispiel.com/anwendung/ hat einen Link "/app2/ und einen Link "app3/".
app2 wird unter www.beispiel.com/app2/ geöffnet und app3 wird unter www.beispiel.com/anwendung/app3/ geöffnet. Das hat mich glaube ich verwirrt.

1 Stimmen

Eine Frage; haben Sie versucht, "http:///media/styles.css" direkt aus Ihrem Browser zu laden?

3 Stimmen

Ich bin der einzige, der es albern findet, dass man bei der Entwicklung mit Django all diese Hürden überwinden muss, um CSS und Bilder zu testen/vorschauen? Klar, man will das nicht in der Produktion machen und einen echten Webserver verwenden, aber für die Entwicklung muss man Styles/Bilder sehen, um eine gute Vorschau zu erhalten.

2 Stimmen

Es gab wirklich nicht viele Hürden zu überwinden. Ich bin einfach dort gestolpert, wo ich wahrscheinlich nicht hätte sein sollen.

51voto

Ty. Punkte 1770

Ich musste das gerade selbst herausfinden.

settings.py:

MEDIA_ROOT = 'C:/Server/Projekte/projekt_name/static/'
MEDIA_URL = '/static/'
ADMIN_MEDIA_PREFIX = '/media/'

urls.py:

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

Template-Datei:

Mit der Datei hier:

"C:/Server/Projekte/projekt_name/static/css/style.css"

5 Stimmen

MEDIA_URL und das ADMIN_MEDIA_PREFIX; sie können gleich sein. Es ist einfach keine gute Idee.

0 Stimmen

Richtig, denn einer wird immer den anderen überschreiben und du wirst letztendlich die Mediendateien deiner App aus dem selben Ordner wie die Mediendateien deines Admins servieren. Das ist normalerweise nicht das gewünschte Ergebnis.

0 Stimmen

Warum steht die URL unter "settings.DEBUG"? Funktioniert es, wenn du nicht im Debug-Modus bist?

11voto

Django hat bereits einen Kontextprozess für MEDIA_URL, siehe Dokumentation von Django.

Es sollte standardmäßig verfügbar sein (es sei denn, Sie haben CONTEXT_PROCESSORS angepasst und vergessen, es hinzuzufügen) in einem RequestContext.

3 Stimmen

Du kannst auch diesem Abschnitt folgen, um deine Entwicklung lokal zu erleichtern: docs.djangoproject.com/en/1.0/howto/static-files

6voto

bchhun Punkte 17426

Normalerweise erstelle ich mein eigenes einfaches Template-Tag, weil Django keine CSS/JavaScript-Dateien bereitstellt. Apache übernimmt das, daher ist meine Media-URL normalerweise 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

Und in meinem Template-File:

{% load media_url %}

Sie könnten auch Ihren eigenen Kontext-Preprocessor erstellen, um die media_url-Variable in jedem Template hinzuzufügen.

17 Stimmen

Oder Sie könnten einfach django.core.context_processors.media verwenden, das eingebaut ist und dasselbe tut.

0 Stimmen

Ahh ich hätte es wissen sollen! Ich war so begierig darauf, meine eigenen Vorlagen-Tags zu erstellen, dass ich diesen verpasst habe!!

0 Stimmen

@Carl Meyer: Bisher beste Antwort. Danke.

2voto

Oli Punkte 226885

Ich benutze nur absolute Benennung. Falls Sie die Website in einem tiefen Pfad ausführen (oder auch wenn Sie es tun), würde ich das .. weglassen und mich stattdessen für etwas wie folgendes entscheiden:

1voto

sykora Punkte 88704

Ich habe ein paar Ideen, ich weiß nicht, welche davon für mich funktioniert :)

Stellen Sie sicher, dass Sie einen abschließenden Schrägstrich verwenden und dass dieser sich vom MEDIA_URL-Einstellung unterscheidet (da derselbe URL nicht auf zwei verschiedene Dateisätze abgebildet werden kann).

Das stammt von http://docs.djangoproject.com/en/dev/ref/settings/#admin-media-prefix

Zweitens könnte es sein, dass Sie Verzeichnisse auf Ihrem Dateisystem mit URL-Pfaden verwechseln. Versuchen Sie, absolute URLs zu verwenden und dann diese zu verfeinern.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X