Warum funktioniert mein statisches CSS nicht in Django?

Lesezeit: 7 Minuten

Benutzer-Avatar
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'

)

Aussicht

#from django.http import HttpResponse
from django.shortcuts import render_to_response


def index(request):
return render_to_response('index.html')

index.html

<link rel="stylesheet" href="{{STATIC_URL}}css/style.css" type="text/css" media="screen" >

Und meine Verzeichnisorganisation ist

src->statische Dateien->css->style.css

  • „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

Benutzer-Avatar
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.

Bei mir änderte es sich

<link rel="stylesheet" href=" {% static '/css/style.css' %} ">

zu

<link rel="stylesheet" type="text/css" href=" {% static '/css/style.css' %} ">

Durch Hinzufügen von RequestContext zur Antwort sollte die Variable STATIC_URL in die Vorlage geladen werden.

Versuchen Sie Folgendes zu ändern:

from django.shortcuts import render_to_response

def index(request):
    return render_to_response('index.html')

zu:

from django.shortcuts import render_to_response
from django.template.context import RequestContext

def index(request):
    return render_to_response("index.html", context_instance=RequestContext(request)) 

Weitere Informationen finden Sie in der Django-Dokumentation auf Verweisen auf statische Dateien in Vorlagen für mehr Informationen.

Benutzer-Avatar
IndieGameDev

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.

Oder Strg + Umschalt + R

  • Damit ist die Frage nicht beantwortet. Sobald Sie über einen ausreichenden Ruf verfügen, können Sie jeden Beitrag kommentieren. stattdessen, Geben Sie Antworten, die keine Klärung durch den Fragesteller erfordern. – Aus Bewertung

    Benutzer17242583

    9. November 2021 um 16:02 Uhr

  • Dies löste das Problem für mich.

    – Melanga Dissanayake

    30. März um 7:09 Uhr

  • Ich bin froh, dass es so war. Funktioniert bei mir jedesmal

    – David Mezza

    21. April um 11:41 Uhr

  • Dies ist die gleiche Antwort wie die von Raghav Rathi vom 26. März und die von Joshua Blue-Jack vom 3. Februar.

    – TylerH

    5. Juli um 13:57 Uhr


1378020cookie-checkWarum funktioniert mein statisches CSS nicht in Django?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy