Warum hat meine Django-Admin-Site nicht den CSS-Stil?

84

Ich erstelle eine Django-Administrationsseite mit der Django-Entwicklungsversion

Aber es hat keinen CSS-Stil:

Alt-Text

Was kann ich tun?

Vielen Dank

zjm1126
quelle
2
Gibt es einen Stil, auf den verwiesen wird und der nicht geladen wird?
Pekka
1
Sie müssen den Entwicklungsserver so
Adam Vandenberg
1
@ Pekka, ja, es ist der Django-Standardstil, es ist in D: \ Python25 \ Lib \ Site-Pakete \ Django \ Contrib \ Admin \ Media
zjm1126
1
Ich hatte das gleiche Problem, dass statische Admin-Inhalte nicht verfügbar waren, sondern mit Nginx (anstelle der Entwicklungsumgebung). Überprüfen Sie grundsätzlich Ihre Nginx-Konfigurationsdatei und stellen Sie sicher, dass sich dort der Speicherort Ihrer 'Collectstatic' befindet. Details hier: serverfault.com/questions/403264/…
Will

Antworten:

14

Django stellt keine statischen Dateien alleine bereit. Sie müssen angeben, wo sich die Dateien befinden.

Das ADMIN_MEDIA_PREFIX in der settings.py zeigt Django an der richtigen Stelle.

Da Sie die Entwicklungsversion verwenden, benötigen Sie das dev-spezifische Dokument für statische Dateien . Adams Link führt Sie zur Version 1.2.

Evan Porter
quelle
10
Gute Antwort, aber jetzt veraltet und fehlt in settings.py. Lesen Sie unten, um aktuellere Lösungen zu erhalten.
RussellStewart
Ich habe den gleichen Fehler, aber in Flask habe ich mein CSS in einen statischen Ordner gelegt. Und benutze jinj2 2 suntax dh {{url_for ('static', filename = 'css / style.css')}}, aber immer noch auf meinem Laptop habe ich diesen Fehler. Ich habe die Seite zwangsweise aktualisiert, aber das Problem besteht weiterhin. Bitte helfen Sie
Salman Mushtaq
65

Nach dem Einrichten Ihres STATIC_ROOTund STATIC_URLmüssen Sie möglicherweise ausführen

python manage.py collectstatic
David Mann
quelle
1
Dies funktioniert auch unter 1.5.2. Ich musste keine Datei oder Code ändern oder hinzufügen
lukik
1
Vielleicht nützlich für jemanden: Sie sollten den gleichen Namen für STATIC_ROOTund verwenden STATIC_URL, zum Beispiel: Ich habe "staticfiles" und "static" kombiniert , verwendet STATIC_ROOT=os.path.join(BASE_DIR, "staticfiles")"und STATIC_URL="/static/". Meine App hat gut funktioniert, aber die Admin-Dateien wurden nicht gefunden. Ändern Sie es also sowohl in " statische
elano7
17

ADMIN_MEDIA_PREFIXist jetzt veraltet, verwenden Sie STATIC_URLstattdessen. Die Einstellung STATIC_URL = '/static/'in settings.py sollte den Job erledigen. Versuchen:

import os.path  import sys

PROJECT_ROOT = os.path.normpath(os.path.dirname(__file__))

und dann:

STATIC_ROOT = os.path.join(PROJECT_ROOT, 'static')
STATIC_URL = '/static/'

Funktioniert mit Django 1.4 Pre-Alpha SVN-16920.

Shamar
quelle
1
Das funktioniert auch bei mir nicht. Ich stelle fest, dass ich auf die CSS-Dateien zugreifen kann , wenn ich den Ordner static/admindarin (manuell) verschiebe static/css/. Es scheint also, dass ich auf die CSS-Dateien zugreifen kann, nur wenn sie sich in der befinden, static/filesaber die Collectstatic sie nicht dort ablegt. Das manuelle Verschieben des Ordners funktioniert natürlich nicht, da die Vorlagen weiterhin auf zeigen static/admin.
toto_tico
Hat bei mir funktioniert, als ich versucht habe, die mit Django v1.2 erstellte, auf 1.3 getestete und dann auf v1.4 erneut bereitgestellte Administrationsoberfläche auszuführen. Laufen Ubuntu 12.04 LTE
Adam Lewis
9

Ich bin auch nach dem Django Book Tutorial auf dieses Problem gestoßen. In Kapitel 5 | Installieren des Modells heißt es im Buch, wenn auf die Standardeinstellung INSTALLED_APPS verwiesen wird: "Kommentieren Sie alle sechs dieser Zeichenfolgen vorübergehend aus, indem Sie ein Hash-Zeichen (#) vor sie setzen." http://www.djangobook.com/de/2.0/chapter05.html

In Kapitel 6 fordert das Buch den Leser auf, 4 dieser 6 Zeilen zu kommentieren. "Beachten Sie, dass wir diese vier INSTALLED_APPS-Einträge in Kapitel 5 auskommentiert haben. Kommentieren Sie sie jetzt aus."

Die Zeile statcifiles ist jedoch erforderlich, um CSS auf der Administrationsseite wiederherzustellen. Kommentieren Sie daher "django.contrib.staticfiles" aus.

Chris SH
quelle
Das Kommentieren von 'django.contrib.staticfiles' in der Datei settings.py, wie oben vorgeschlagen, hat auch bei mir funktioniert. 'django.contrib.staticfiles' sollte standardmäßig in Ihrer Datei settings.py unter INSTALLED_APPS vorhanden sein. Danke Chris für deinen Vorschlag.
user2471242
Ich bin auch aus dem Django-Buch hierher gekommen. Diese Ein-Zeichen-Entfernung macht es.
Pbarill
8

Ich habe mehrere andere Threads gelesen, die versucht haben, dies zu beheben. Ich habe auf einen Alias ​​zurückgegriffen, wie in anderen Threads. Dies setzt voraus, dass Ihre eigene benutzerdefinierte App statische Dateien korrekt bereitstellt. Dies würde darauf hinweisen, dass STATIC_ROOT und STATIC_URL über die richtigen Einstellungen verfügen.

STATIC_ROOT = ''
STATIC_URL = '/static/'

Dann (aus Ihrem statischen Verzeichnis):

ubuntu@ip-1-2-3-4:/srv/www/mysite.com/app_folder/static$ sudo ln -s /usr/local/lib/python2.7/dist-packages/django/contrib/admin/static/admin/ admin

Hoffe das hilft jemandem ... es gibt viele Themen zu diesem Thema. :(

Taylor
quelle
Dies ist Antwort funktioniert wie Zauber, danke Taylor. Gut gemacht
Spikie
3

In müssen /project_name/project_name/settings.pySie festlegen STATIC_URL, um Ihrer Site mitzuteilen, welche URL für statische Dateien verwendet werden soll.

Stellen Sie STATIC_ROOTdann einen Ordner in Ihrem Dateisystem ein, der nicht mit einem der in aufgeführten Verzeichnisse identisch istSTATICFILES_DIRS Liste Verzeichnisse .

Sobald dies festgelegt STATICFILES_ROOTist, werden Sie python manage.py collectstaticaus dem Projektverzeichnis ausgeführt.

Dadurch werden alle statischen Administratordateien und alle Dateien in anderen in der STATICFILES_DIRSListe aufgeführten Ordnern kopiert . Grundsätzlich werden alle Ihre statischen Dateien an einem Ort gespeichert, sodass Sie sie bei der Bereitstellung Ihrer Site auf Ihr CDN verschieben können. Wenn Sie wie ich sind und kein CDN haben, haben Sie zwei Möglichkeiten:

  1. Fügen Sie den von Ihnen festgelegten Ordner STATIC_ROOTzur STATICFILES_DIRSListe hinzu. Dadurch können die Finder für statische Dateien in Django alle statischen Dateien finden.
  2. Verschieben Sie den gesamten Ordner mit statischen Dateien an eine andere Stelle in Ihrem Dateisystem und weisen Sie STATICFILES_DIRSdiesen neuen Speicherort direkt an.

Ich mache mit dieser Antwort keine Kommentare zur Sicherheit, es ist nur die Art und Weise, wie ich mit meinem Webserver für kleine Projekte entwickeln konnte. Ich gehe davon aus, dass Sie ein CDN wollen, wie es Django vorschlägt, wenn Sie etwas Größeres tun.

UPDATE: Ich bin gerade auf dieses Problem gestoßen und diese Methode hat nicht ganz das getan, was ich denke, dass Sie wollen. Was für mich letztendlich funktioniert hat, war, dass ich nach collectstaticdem Ausführen nur die statischen Admin-Dateien, die sie abgelegt haben, STATICFILES_ROOTin das Verzeichnis kopiert habe, das ich für meine eigenen statischen Dateien verwendet hatte. Das hat das Problem für mich gelöst.

Brad P.
quelle
3

Zusätzlich zu vielen anderen nützlichen Antworten hatte ich ein Problem, das noch nicht bemerkt wurde. Nach dem Upgrade von Django 1.3 auf 1.6 hatte mein Verzeichnis statischer Dateien einen fehlerhaften symbolischen Link zu den statischen Dateien des Django-Administrators.

Meine settings.py wurde konfiguriert mit:

STATICFILES_DIRS = (
    '/var/www/static/my-dev',
)

Nach dieser Antwort ,

Django wird nun erwarten, die statischen Admin-Dateien unter der URL / admin / zu finden.

Ich hatte eine symbolische Verknüpfung, /var/www/static/my-dev/admindie auf Folgendes eingestellt war:

admin -> /usr/local/lib/python2.7/dist-packages/django/contrib/admin/media/

Dieser Speicherort ist in Django 1.6 nicht mehr vorhanden, daher habe ich den Link aktualisiert zu:

admin -> /usr/local/lib/python2.7/dist-packages/django/contrib/admin/static/admin/

Und jetzt funktioniert meine Admin-Site richtig.

cod3monk3y
quelle
2

Wenn Sie den Apache-Server zum Hosten Ihrer Django-Site verwenden, müssen Sie sicherstellen, dass der statische Alias ​​auf Ihr Verzeichnis / site / site_media / static / verweist. Wenn sich Ihre statischen Dateien im Verzeichnis / to site / site / site_media / static / befinden, funktioniert die vorherige Apache-Alias-Konfiguration nicht.

Yulun
quelle
2

Während ich dem Django-Tutorial folgte, hatte ich ein ähnliches Problem. In meinem Fall war das Problem der Mimetyp, der vom Entwicklungsserver beim Bereitstellen von CSS-Dateien verwendet wurde.

Der bereitgestellte Mimetyp war "application / x-css", was in Chrome (auf der Registerkarte "Netzwerk" der Entwicklertools) zu der folgenden Warnmeldung führte:

Ressource als Stylesheet interpretiert, aber mit MIME-Typ application / x-css übertragen: " http://127.0.0.1:8000/static/admin/css/base.css "

Die Problemumgehung, die ich gefunden habe: Ändern des zu bedienenden Mimetyps durch Hinzufügen der folgenden Zeilen zur Datei manage.py der django-Webanwendung:

import mimetypes
mimetypes.init()
mimetypes.types_map['.css'] = 'text/css'

Hinweis: Arbeitete für mich mit Django 1.7.4 unter Python 2.7 und Chrome 40.0

Gio
quelle
habe dies mit Django 2.2.1 versucht und es funktioniert nicht. Die statischen CSS-Dateien meines Admin-Panels werden von Nginx mit HTTP-Code 200 bereitgestellt, aber Chrome gibt an, dass sie als eingehen Content-Type: text/plainund nicht auf der Seite gerendert werden.
user5359531
1

Stellen Sie sicher, dass 'django.contrib.staticfiles'sich dies INSTALLED_APPSin Ihrer settings.py befindet

RedRory
quelle
1

Dieselbe Art von Problem, auf die ich bei der Entwicklung einer Site in django-1.10.5 und python-2.7.13 gestoßen bin. Aber in meinem Firefox-51 und Chrome konnte die Anmeldeseite das CSS abrufen, aber es gab immer noch kein Styling. Aber seltsamerweise funktionierte es auf IE-8 ..

Ich habe versucht, alles Mögliche zu tun, was hier erwähnt und für meine SW-Versionen geeignet ist. Keiner hat funktioniert.

Aber als ich die gleiche Seite auf einem anderen System ausprobierte, das Python-2.7.8 hatte, funktionierte es.

Gerade gepostet, wenn es jemandem helfen kann ...

bearbeitet: später stellte ich fest, dass in Python-2.7.13 das Schreiben der folgenden zwei Zeilen in settings.py (plus Löschen des Cache des Browsers) den Trick getan hatte

import mimetypes
mimetypes.add_type("text/css", ".css", True)
Nikhil Saxena
quelle
1

Lauf: python manage.py collectstatic

Fügen Sie diese Zeile zu Vhost hinzu, das sich unter: /etc/apache2/sites-available/000-default.conf befindet

Alias ​​/ static / admin / /var/www/html/example.com/static/admin

Hier ist die gesamte Vhost-Einstellung für das Django-Setup

<VirtualHost *:80>
        ServerName gautam.tech
        ServerAlias www.gautam.tech

        WSGIDaemonProcess gautam.tech python-path=/var/www/html/gautam.tech python-home=/var/www/html/gautam.tech/venv
        WSGIProcessGroup gautam.tech
        #Your static files location
        Alias /static /var/www/html/gautam.tech/static
        Alias /media/ /var/www/html/gautam.tech/media
        Alias /static/admin/ /var/www/html/gautam.tech/static/admin

        <Directory /var/www/html/gautam.tech/static>
                Require all granted
        </Directory>

        <Directory /var/www/html/gautam.tech/media>
                       Require all granted
        </Directory>

        WSGIScriptAlias / /var/www/html/gautam.tech/myproject/wsgi.py

        DocumentRoot /var/www/html/gautam.tech
        <Directory /var/www/html/gautam.tech>
                <Files wsgi.py>
                        Require all granted
                </Files>
        </Directory>

        CustomLog /var/www/html/gautam.tech/access.log combined
        ErrorLog /var/www/html/gautam.tech/error.log
</VirtualHost>

Das wird sicher funktionieren!

Kundan Roy
quelle
Sehr gute Antwort. Ich musste nur den Befehl collectstatic ausführen.
PowerAktar
0

Wenn Sie in settings.py einen Wert für STATICFILES_DIRS festgelegt haben und der deklarierte Ordner nicht vorhanden ist oder sich an einer falschen Position befindet, hat der Administrator kein Styling, z. B. durch Definieren von STATICFILES_DIRS = (os.path.join (BASE_DIR, "static"). )) und der statische Ordner existiert nicht

cormacio100
quelle
0

Nachdem ich Tausende von Vorschlägen ausprobiert hatte, fand ich endlich eine Lösung, die half. Hier ist, was ich versucht habe und was ich verwendet habe. Ich benutze Django-1.11 und Nginx Webserver. Erstens habe ich sichergestellt, dass meine CSS / js-Dateien nicht 404 in der Browserkonsole erhalten. Danach konnte ich eine Warnung sehen

Ressource als Stylesheet interpretiert, aber mit MIME-Text / Plain übertragen

Ich habe die base.html in Admin-Vorlagen gefunden und entfernt

type="text/css"

und jetzt sehen die Zeilen so aus:

<link rel="stylesheet"  href="{% block stylesheet %}{% static "admin/css/base.css" %}{% endblock %}" /> 

Dies hat das Problem für mich behoben.

Rahul Singal
quelle
0

Wenn sich das Problem auf einem dev / test / prod-Server befindet und Nginx verwendet, führen Sie bitte die folgenden Schritte aus.

  • Stellen Sie die Konfigurationen in settings.py wie folgt ein

    STATIC_URL = '/static/'
    
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    STATIC_ROOT = os.path.join(BASE_DIR, 'static')
  • Führen Sie den folgenden Befehl aus, um CSS- und JS-Dateien im statischen Ordner zu erstellen

    $ python manage.py collectstatic
  • Konfiguration in / etc / nginx / sites-enabled / example (Nginx), um statische Dateien bereitzustellen

    location /static/ {
            alias /project/root/folder/static/;
    }
SuperNova
quelle
0

das funktioniert gut und einfach. Ich habe den Ordner (manuell) verschoben. Sie müssen nur Ihre static/adminaus dem Verzeichnis des Hauptprojekts kopieren und in public_html einfügen, static/wenn kein statischer Ordner vorhanden ist. Sie müssen den folgenden Befehl im Terminal ausführen

python manage.py collectstatic

Hier geht es mit CSS-Arbeit von Django Admin

Jahanzeb Nawaz
quelle
0

Konfigurieren statischer Dateien Stellen Sie sicher, dass diese django.contrib.staticfilesin Ihrem INSTALLED_APPS enthalten sind .

Definieren Sie in Ihrer Datei settings.py beispielsweise STATIC_URL:

STATIC_URL = '/static/'

Für weitere Details statische Dateien

MoShamroukh
quelle