Warum funktioniert mein statisches CSS nicht in Django?
Lesezeit: 7 Minuten
AustinT
Ich habe ein Problem mit meinem statischen CSS, das für meine Django-Web-App nicht funktioniert. Ich habe die Anweisungen von befolgt Django Static Link-Tutorial beim Umgang mit statischen Dateien, aber es funktioniert immer noch nicht.
Einstellungen
# Absolute path to the directory static files should be collected to.
# Don't put anything in this directory yourself; store your static files
# in apps' "static/" subdirectories and in STATICFILES_DIRS.
# Example: "/home/media/media.lawrence.com/static/"
STATIC_ROOT = '/Users/a9austin/Development/sites/AlphaSocks/src/static_root/'
# URL prefix for static files.
# Example: "http://media.lawrence.com/static/"
STATIC_URL = '/static/'
# Additional locations of static files
STATICFILES_DIRS = (
# Put strings here, like "/home/html/static" or "C:/www/django/static".
# Always use forward slashes, even on Windows.
# Don't forget to use absolute paths, not relative paths.
'/Users/a9austin/Development/sites/AlphaSocks/src/staticfiles'
)
„Was“ funktioniert nicht? Wie rendern Sie Ihre Ansichten mit render() oder render_to_response()? Ist der Kontextprozessor für statische Dateien in settings.py aktiviert?
– Jure C.
19. November 2012 um 1:06 Uhr
Ja, ich verwende render_to_response, ich werde es mit meiner Ansicht aktualisieren. Es funktioniert nicht, weil das CSS mein HTML nicht wirklich ändert.
– AustinT
19. November 2012 um 1:11 Uhr
siehe diesen Beitrag zum Umgang mit statischen Dateien
– Otskimanot Sqilal
19. November 2012 um 1:15 Uhr
@OtskimanotSqilal Vielen Dank für die Antwort, ich habe es gerade mit meinem STATICFILES_DIR aktualisiert, mein CSS wird immer noch nicht angezeigt.
– AustinT
19. November 2012 um 1:32 Uhr
So wie du es konfiguriert hast STATICFILES_DIRS und STATIC_ROOT ist falsch. Sie können nicht dieselben Verzeichnisse enthalten. Weitere Informationen finden Sie in meiner Antwort.
– miki725
19. November 2012 um 1:50 Uhr
miki725
Damit Django statische Dateien bereitstellen kann, müssen Sie sicherstellen, dass Sie einige Einstellungen vorgenommen haben.
STATIC_URL
Diese Einstellung gibt an, welcher URL statische Dateien zugeordnet werden sollen. Das hast du schon gemacht.
STATICFILES_DIRS
Dies gibt alle Ordner auf Ihrem System an, in denen Django nach statischen Dateien suchen soll. Die Idee ist, dass Sie möglicherweise ein paar Apps in Ihrem Projekt haben und jede App möglicherweise einen anderen Satz statischer Dateien benötigt. Aus organisatorischen Gründen könnte jede App also eine enthalten static Verzeichnis, in dem nur seine statischen Dateien gespeichert werden. Dann muss Django also wissen, wo sich diese Verzeichnisse befinden. Dafür ist diese Einstellung da.
STATIC_ROOT
Diese Einstellung gibt an, wohin Django alle statischen Dateien kopiert und nicht, wo sich die statischen Dateien bereits befinden. Die Idee ist, dass Django, sobald Sie die Entwicklung in die Produktion verlassen, aufgrund von Problemen, auf die ich hier nicht eingehen werde, keine statischen Dateien mehr bereitstellen kann (es ist in der Artikel). Für die Produktion sollten sich jedoch alle statischen Dateien in einem einzigen Verzeichnis befinden, anstatt in vielen wie in angegeben STATICFILES_DIRS. Diese Einstellung gibt also ein Verzeichnis an, in das Django alle statischen Dateien aus allen darin enthaltenen Dateien kopiert STATICFILES_DIRS indem Sie den folgenden Befehl ausführen:
$ python manage.py collectstatic
Bitte beachten Sie, dass dies nur erforderlich ist, wenn Sie in die Produktion gehen, und dass das hier angegebene Verzeichnis nicht mit einem der in angegebenen Verzeichnisse identisch sein kann STATICFILES_DIRS.
URLs.py
In der Entwicklung für Django, um Ihre statischen Dateien bereitzustellen, müssen Sie die statischen URLs in Ihre urls.py aufnehmen:
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
urlpatterns = ...
urlpatterns += staticfiles_urlpatterns()
Sobald Sie alle oben genannten Dinge abgeschlossen haben, sollten Ihre statischen Dateien so lange bereitgestellt werden, wie Sie haben DEBUG = True. Aus der obigen Liste scheinen Sie nur abzuschließen STATIC_URL. Bitte beachten Sie auch, dass alle oben beschriebenen Schritte in den Dokumenten enthalten sind, die Sie in Ihrer Frage verlinkt haben (Verknüpfung). Es mag am Anfang etwas verwirrend sein, aber wenn Sie es ein paar Mal lesen, wird es klarer.
Danke für Ihre Antwort. Lassen Sie mich sicherstellen, dass ich es verstehe. STATICFILES_DIR ist also tatsächlich dort, wo sich die statischen Dateien befinden. Und in STATIC_ROOT wird Python sie kopieren/verarbeiten?
– AustinT
19. November 2012 um 2:15 Uhr
Ja, aber es kopiert sie nur, indem es die ausführt manage.py Befehl und ist nur für die Produktion notwendig. In der Entwicklung wird Django statische Dateien suchen und bereitstellen, die sich in einem der Verzeichnisse in befinden STATICFILES_DIRS. Außerdem habe ich vergessen zu erwähnen, in der Ansicht unbedingt zu verwenden RequestContext verwenden zu können {{ STATIC_URL }}. Das zeigt die Antwort von Kavanaugh Development.
– miki725
19. November 2012 um 2:18 Uhr
Okay, als ich python manage.py collectstatic anrief, gab es mir einen Fehler. ‘”Ihre STATICFILES_DIRS-Einstellung ist kein Tupel oder keine Liste; ” django.core.exceptions.ImproperlyConfigured: Ihre STATICFILES_DIRS-Einstellung ist kein Tupel oder keine Liste; Vielleicht haben Sie ein abschließendes Komma vergessen?’ Ich habe meinen Beitrag dahingehend aktualisiert, dass ich meinen Stamm und mein Verzeichnis geändert habe. Bitte schau es dir an. Nochmals vielen Dank, dass Sie mir geholfen haben
– AustinT
19. November 2012 um 2:25 Uhr
Recht. Also dein STATICFILES_DIRS ist wie ( 'string_here' ) was kein Tupel ist. Ändern Sie das zu ( 'string_here', ) das ist ein Python-Tupel.
– miki725
19. November 2012 um 2:30 Uhr
Aber noch einmal, für die Entwicklung müssen Sie nicht alle statischen Dateien sammeln. Django wird ihnen aus dienen STATICFILES_DIRS Verzeichnisse direkt…
– miki725
19. November 2012 um 2:32 Uhr
Versuchen Sie, Ihren Cache zu löschen. Wenn Sie Google Chrome verwenden, gehen Sie zu Ihren Einstellungen> Browserdaten löschen> wählen Sie zwischengespeicherte Bilder und Dateien löschen und klicken Sie dann auf Daten löschen
Nachdem Sie alles getan haben, setzen Sie DEBUG = True, Python Collectstatic, leeren den Cache, öffnen im Inkognito-Modus, wenn das Problem weiterhin besteht, kopieren Sie Ihre .css-Datei in eine andere neue .css-Datei im statischen Ordner und führen Sie dann den Befehl collectstatic aus. Das hat bei mir geklappt. Ich hoffe, dies wird dir helfen.
Wenn es kein Problem bei der Codierung gibt und keine Fehler angezeigt werden. Dann können Sie dies tun, um zu versuchen, das Problem zu lösen.
Löschen Sie Ihren Cache:
Wenn Sie Google Chrome verwenden, gehen Sie zu Ihren Einstellungen –> Browserdaten löschen –> Wählen Sie zwischengespeicherte Bilder und Dateien löschen und klicken Sie dann auf Daten löschen
Manchmal braucht es nur “Strg + F5”
Eine vollständige Aktualisierung der Seite reicht aus.
„Was“ funktioniert nicht? Wie rendern Sie Ihre Ansichten mit render() oder render_to_response()? Ist der Kontextprozessor für statische Dateien in settings.py aktiviert?
– Jure C.
19. November 2012 um 1:06 Uhr
Ja, ich verwende render_to_response, ich werde es mit meiner Ansicht aktualisieren. Es funktioniert nicht, weil das CSS mein HTML nicht wirklich ändert.
– AustinT
19. November 2012 um 1:11 Uhr
siehe diesen Beitrag zum Umgang mit statischen Dateien
– Otskimanot Sqilal
19. November 2012 um 1:15 Uhr
@OtskimanotSqilal Vielen Dank für die Antwort, ich habe es gerade mit meinem STATICFILES_DIR aktualisiert, mein CSS wird immer noch nicht angezeigt.
– AustinT
19. November 2012 um 1:32 Uhr
So wie du es konfiguriert hast
STATICFILES_DIRS
undSTATIC_ROOT
ist falsch. Sie können nicht dieselben Verzeichnisse enthalten. Weitere Informationen finden Sie in meiner Antwort.– miki725
19. November 2012 um 1:50 Uhr