Django-grappelli: Die Filterfunktion auf Admin-Seiten funktioniert nicht, es sei denn, Aktionen = Keine auf ModelAdmins

Erstellt am 3. Okt. 2012  ·  55Kommentare  ·  Quelle: sehmaschine/django-grappelli

Hallo alle,

Sofern Aktionen = None in meinen ModelAdmin-Klassendefinitionen, Grappelli-Erhöhungen und Javascript-Ausnahmen und die Filterfunktionalität (mit Feldern, die in list_filter definiert sind) unterbrochen werden. Die Dropdown-Schaltfläche wird angezeigt, aber nichts wird heruntergeklappt, wenn Sie darauf klicken.

Der Fehler lautet "Uncaught TypeError: Object [object Object] has no method 'actions'" in der Zeile $("tr input.action-select").actions(); (Zeile 66 in der Grappelli-Vorlage).

Das relevante Code-Snippet aus dem Grappelli-Code

Ich denke auch, dass dies Ausgabe Nr. 206 ähneln könnte.

Ich verwende Django 1.4.1 und Grappelli 2.4.2

discussion

Alle 55 Kommentare

Sind Sie sicher, dass Sie den Cache geleert haben und die richtigen Dateien laden?
weil ich das nicht reproduzieren kann (und ich bin mir ziemlich sicher, dass dieser Fehler nicht existiert).

Ich habe es noch einmal überprüft und kann das nicht reproduzieren ... Bitte öffnen Sie das Ticket erneut, wenn Sie glauben, dass es sich um einen Fehler handelt.

Sie haben Recht - es muss ein Cache-Problem gewesen sein, denn es ist jetzt weg. Seltsam ist, dass ich einen Entwicklungsserver (Werkzeug) verwende und keine Cache-Header gesetzt habe. Ich hatte noch nie ein Problem damit, dass Chrome etwas automatisch zwischenspeichert. Ist etwas an den dynamisch generierten Inhalten von Grappelli anders? Wenn ja, könnten wir eine Art Hinweis für andere einfügen? Es sieht so aus, als wäre es schon einmal passiert (siehe oben erwähnte Ausgabe Nr. 206).

Ich bin auch darüber gestolpert und es sieht für mich nicht nach einem Cache-Problem aus. Selbst wenn ich den Cache in Chrome und Firefox lösche und die Admin-Site erneut besuche, verschwindet der Fehler nicht. Auch ein Neustart des Django-Servers (ich verwende Gunicorn) hilft nicht. Ich habe Grappelli noch nicht konfiguriert, sondern nur über pip installiert (django-grappelli==2.4.2) und in die INSTALLED_APPS in settings.py (vor django.contrib.admin) aufgenommen.

Das Problem ist meiner Meinung nach, dass der fehlgeschlagene Aufruf von ".actions()" grp.jQuery verwendet, aber .action() nur in django.jQuery definiert ist. In grappelli.min.js scheinen Sie zu versuchen, django.jQuery auf grp.jQuery zu setzen, damit sie gleich sind, aber da die Grappelli-Skripte vor den Django-Admin-JavaScripts geladen werden, funktioniert das nicht.

So sieht der HTML-Code einer Django-Admin-Listen-Übersichtsseite in meinem Fall aus:

<!-- jQuery, jQuery-UI -->
<script src="/static/grappelli/jquery/jquery-1.7.2.min.js" type="text/javascript"></script>
<script src="/static/grappelli/jquery/ui/js/jquery-ui-1.8.18.custom.min.js" type="text/javascript"></script>

<!-- Grappelli Minified -->
<script src="/static/grappelli/js/grappelli.min.js" type="text/javascript"></script>

<script type="text/javascript" src="/static/admin/js/core.js"></script>
<script type="text/javascript" src="/static/admin/js/admin/RelatedObjectLookups.js"></script>
<script type="text/javascript" src="/static/admin/js/jquery.js"></script>
<script type="text/javascript" src="/static/admin/js/jquery.init.js"></script>
<script type="text/javascript" src="/static/admin/js/actions.js"></script>

<script type="text/javascript" src="/admin/jsi18n/"></script>

<script type="text/javascript" charset="utf-8">
    (function($) {
        $(document).ready(function() {
            $("tr input.action-select").actions();
        });
    })(grp.jQuery);
</script>

Dies kann durchaus ein Konfigurationsfehler auf meiner Seite sein, aber für mich sieht es nicht nach einem Caching-Problem aus ...

OK, ich glaube, ich habe den Grund gefunden und es sieht aus wie ein Django-Bug: Wenn Sie die statische Dateientwicklungsansicht von Django verwenden, um Ihre statischen Dateien bereitzustellen, bedient Django nicht die überschriebenen jquery.js und jquery.init.js von grappelli, aber stattdessen die Originaldateien aus dem Django-Admin, was diesen Fehler verursacht. :( Jetzt stelle ich meine statischen Dateien auch während der Entwicklung mit nginx bereit und es funktioniert gut.

Ich verwende statische Muster, aber ich kann dies immer noch nicht reproduzieren.

@philwo du sagst, dass grappellis jquery.js nicht geladen wird. Wenn das der Fall ist, gibt es viele Funktionen, die nicht funktionieren, richtig (zB Autocompletes)? im Grunde wird nicht viel vom Admin wie erwartet funktionieren ...

@sehmaschine Ja, das war der Fall, die Funktionen, die auf JavaScript angewiesen waren, funktionierten nicht. Ich werde in den nächsten Tagen versuchen, die Ursache für dieses Problem an meiner Konfiguration zu finden und mich bei Ihnen melden.

Das ist äußerst merkwürdig.

Ich kann es reproduzieren, wenn ich den Django-Devserver mit "./manage.py runserver" oder Gunicorn mit "./manage.py run_gunicorn" ausführe - dann scheint Django meine gesamte statische Dateikonfiguration mit Standardwerten zu überschreiben (selbst wenn ich konfigurieren Sie es absichtlich völlig falsch und geben Sie nicht vorhandene Klassen in den Einstellungen an. STATICFILES_FINDERS werden weiterhin statische Dateien bereitstellen).

Wenn ich gunicorn mit "gunicorn myapp. wsgi:application " ausführe, verwendet Django meine Einstellungen korrekt und ich muss meiner urls.py das übliche "urlpatterns += staticfiles_urlpatterns()" hinzufügen, damit statische Dateien funktionieren. Dann funktioniert die Überschreibung und die JS-Dateien von Grappelli werden korrekt anstelle der ursprünglichen Django-Admin-Dateien bereitgestellt.

Ich werde ein Minimalbeispiel erstellen und wenn ich erfolgreich bin, werde ich dies als Problem auf code.djangoproject.com melden.

da wir kurz vor einer neuen Veröffentlichung stehen, wäre es schön, dieses Problem zu lösen ...

  1. Es scheint, dass STATICFILES_FINDERS nicht mit Runserver verwendet wird (ich kann das reproduzieren).
  2. Trotzdem kann ich Django die Grappelli-Dateien nicht überschreiben (es sei denn, ich füge "django.contrib.admin" vor "grappelli" mit INSTALLED_APPS hinzu).

jede zusätzliche Information ist hilfreich ... thx.

Ich habe das gleiche Problem. Ich verwende Django 1.4.1 und habe Grappelli in installierten Apps vor contrib.admin.

<script type="text/javascript" charset="utf-8">
        (function($) {
            $(document).ready(function() {
                $("tr input.action-select").actions();
            });
        })(grp.jQuery);
</script>

Wenn ich change_list.html bearbeite, um django.jQuery zu übergeben, funktioniert die Filterliste wie erwartet. Keine großartige Lösung, aber ich hoffe, wenn es einen Einblick gibt.

<script type="text/javascript" charset="utf-8">
        (function($) {
            $(document).ready(function() {
                $("tr input.action-select").actions();
            });
        })(django.jQuery);
</script>

Ich habe dieses Problem auch, wenn Django 1.4.2 und Grappelli 2.4.3 auf einer Neuinstallation von Ubuntu 10.04 ausgeführt werden

$("tr input.action-select").actions is not a function

ist der Fehler, der mit Firebug angezeigt wird.

Der Filter funktioniert nicht und ich kann keine Elemente zum Löschen auswählen.

Ich habe versucht, den Domainnamen direkt und auch mit Runserver zu verwenden.

Zuerst bekam ich den Fehler bei beiden, aber beim Ändern

STATIC_URL = 'http://somedomain.com/static/'

zu einfach

STATIC_URL = '/static/'

Das Problem bei der Verwendung von Runserver wurde behoben, aber das Problem besteht weiterhin bei der Verwendung des Domänennamens.

Ich habe den HTML-Ausgabecode beider verglichen und sie sind identisch.

Auf meinem Dev-Server funktioniert alles einwandfrei und ich möchte mich ganz herzlich für ein fantastisches Produkt bedanken. Daumen drücken, dafür kann ein Fix gefunden werden.

Alle weiteren Informationen, die ich Ihnen liefern kann, fragen Sie bitte einfach.

Gibt es Fortschritte bei diesem Problem?

Ich muss zwei Sites für Kunden live schalten, und ich muss etwas umcodieren, wenn ich zu den Django-Vorlagen zurückkehren muss.

@maffacow Da ich dieses Problem nie reproduzieren konnte, bin ich auf Feedback angewiesen. Bisher bin ich mir nicht sicher, was ein "Fix" sein könnte ...

Da die Website noch nicht online ist, kann ich Ihnen bei Bedarf einen ssh-Zugang gewähren? Oder gibt es irgendwelche Informationen, die ich Ihnen geben kann?

gut ... Sie können debuggen, das Problem finden (falls es tatsächlich existiert) und eine Pull-Anfrage senden. das ist der einfachste Weg, es zu lösen.

Ich habe das gleiche/ähnliche Problem, die Site funktioniert gut auf dem Devserver, aber das Laden von JS scheint auf dem Produktionsserver (nginix) nicht richtig zu funktionieren.

Djangos standardmäßige jquery-Bibliotheken werden geladen und nicht die Grappelli-Überschreibungen

Der einzige Ort, an dem Grappelli-Javascripts funktionieren, ist auf der Hauptadmin/-Seite, dh das click()-Ereignis wird für das Dropdown-Menü Benutzeroptionen behandelt, wenn Sie auf den Benutzernamen im oberen Menü klicken, aber nur, wenn Sie sich auf dem Hauptadmin-Dashboard befinden . (weil Django seine Jquery-Bibliotheken nicht auf das Haupt-Admin-Dashboard lädt)

Django 1.4.2 mit Grappelli 2.4.3, kein Caching aktiviert, alles scheint richtig konfiguriert zu sein. Habe zahlreiche Django 1.3-Sites mit Grappelli auf ähnlichem Produktions-Setup ohne Probleme.

Ok, ich habe es endlich auf meinem System zum Laufen gebracht.

Sehmaschine, ist in meinem Fall richtig, es war eigentlich kein Bug, sondern hat eher mit meinen Einstellungen zu tun.

Ich habe die statischen Dateien aus den dist-Paketen mit Apache in meine Sites-Available-Datei geladen.

<br i="8"/> Alias /static/grappelli /usr/local/lib/python2.6/dist-packages/grappelli/static/grappelli<br i="9"/> Alias /static /usr/local/lib/python2.6/dist-packages/Django-1.4-py2.6.egg/django/contrib/admin/static<br i="10"/>

Das war dumm, ich weiß, aber die Art und Weise, wie mir gezeigt wurde, als ich Django zum ersten Mal kennenlernte

Alles, was ich haben musste, war
<br i="15"/> Alias /static /srv/www/mywebsite.com/public_html/static<br i="16"/>

und in meiner settings.py
<br i="20"/> STATIC_ROOT = '/srv/www/mywebsite.com/public_html/static/'<br i="21"/> STATIC_URL = '/static/'<br i="22"/>

Ich hoffe, dass dies anderen etwas helfen kann, und noch einmal vielen Dank für ein so großartiges Skript

OK, ich habe mein Problem auch herausgefunden, es war tatsächlich ein Caching-/Konfigurationsfehler.

Caching wurde für HTTP deaktiviert, aber für SSL /statischer Alias ​​aktiviert.

Ich hatte eine ähnliche Konfiguration wie maffacow.

Die Verwendung des Befehls collectstatic und das Entfernen des Alias ​​für die Verwaltungsdateien in der Serverkonfiguration hat das Problem für mich behoben.

Ich habe das gleiche Problem: Das Löschen des Browser-Cache hat es gelöst

Ich habe das gleiche Problem bei der Bereitstellung in Google App Engine. Funktioniert gut auf meinem lokalen Rechner. Aus der Quelle der generierten Seite sehe ich die folgenden Einträge für verschiedene JS-Bibliotheken, wenn sie auf GAE ausgeführt werden:

jquery-1.7.2.min.js aus /static/grappelli
jquery-ui-1.8.18.custom.min.js aus /static/grappelli

grappelli.min.js von /static/grappelli

core.js aus /static/admin
RelatedObjectLookups.js aus /static/admin
jquery.js aus /static/admin
jquery.init.js aus /static/admin
actions.js aus /static/admin

Ich habe den Browser-Cache gelöscht, collectstatic ausgeführt und die statischen URLs gemäß den Dokumenten von Google eingerichtet. Wenn ich diese Einträge mit einer lokal generierten Seite überprüfe, stimmen die JS-Einträge überein ...

Leider noch keine Lösung. Übrigens, danke für ein tolles Skript ...

Ich hatte dieses Problem und löste es, indem ich sicherstellte, dass AppDirectoriesFinder an erster Stelle unter den STATICFILES_FINDERS steht, wie folgt:

STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
    'django.contrib.staticfiles.finders.FileSystemFinder',
 )

@ulmus , das ist ein guter Punkt – wir werden die Dokumentation mit diesen Informationen aktualisieren.

Ich hatte dieses Problem heute auch. Ich habe dafür gesorgt, dass AppDirectoriesFinder in STATICFILES_FINDERS an erster Stelle steht und dass meine STATIC_ROOT , STATICFILES_DIRS und STATIC_URL alle richtig eingestellt sind.

Die Lösung für mein Problem bestand schließlich darin, GRAPPELLI_INDEX_DASHBOARD von meiner local.py -Einstellungsdatei in meine base.py -Einstellungsdatei zu verschieben, über allen oben genannten Deklarationen.

@idboehman danke für den Hinweis, aber ich bin mir sehr sicher, dass GRAPPELLI_INDEX_DASHBOARD überhaupt nichts mit den Aktionen zu tun hat. Ich vermute, dass dieses Problem durch Caching verursacht wird (könnte Browser-Cache sein, könnte alte .pyc-Dateien sein).

Ich habe dieses Problem schon lange. Der STATICFILES_FINDERS Fix hat bei mir funktioniert.

Die Art und Weise, wie ich dies tat, bestand darin, einen Simlink zu grappelli/static/admin (mit den fraglichen js-Dateien) in meinem staticfiles-Ordner zu erstellen. STATICFILES_FINDERS hat nicht geholfen.

Das hat es auch für mich gelöst, zzart.

Nur Vermutung, aber das Problem scheint zu sein, dass nach den Installationsanweisungen die integrierte jquery-Bibliothek von Django nach dem Grappelli jquery-1.7.2 geladen wird. Das Erstellen des Links, wie Sie es beschreiben, führt dazu, dass die jquery-Bibliothek effektiv zweimal geladen wird, aber zumindest ist es dieselbe Bibliothek.

habe das gleiche Problem. Versuchte den GRAPPELLI_INDEX_DASHBOARD-Vorschlag, den Cache-Löschvorschlag, den STATICFILES_FINDERS-Vorschlag und stellte sicher, dass alle Pfade für statische Dateien den Dokumentationsstandards entsprachen. Kein Glück. Vielleicht werde ich die Änderung des js-Vorschlags versuchen, scheint aber eher adhoc zu sein. nun ja.

@zzart Wenn Sie einen Symlink benötigen, stimmt etwas mit der Einrichtung Ihrer Staticfiles nicht ... alle Staticfiles sollten automatisch gefunden werden, wenn Sie Collectstatic ausführen.

@tufelkinder djangos built–in jquery wird von grappelli überschrieben (es gibt keinen Inhalt mit jquery.min.js).

In zwei Monaten hatte ich dieses Problem dreimal und jedes Mal habe ich es auf eine andere Weise gelöst.

Aber ich habe festgestellt, dass, wenn Sie dem @ulmus-Kommentar zu AppDirectoriesFinder folgen und in Ihrem statischen Ordner Ihren Ordner admin > js durch Ihren Ordner grapelli > static > admin > js ersetzen, das Problem gelöst ist!

Hallo Leute, ich stand vor diesem Problem und der Kern dieses kniffligen Problems ist, dass jquery zweimal vorhanden ist. Sie können das sehen, wenn Sie in Ihrem Browser in die HTML-Quelle schauen.

Ich wollte keinen Symlink verwenden, also habe ich dies zu nginx site conf hinzugefügt:

location = /static/admin/js/jquery.js {
    alias /dev/null;
}

@grafa aber die Datei /static/admin/js/jquery.js ist leer, siehe
https://github.com/sehmaschine/django-grappelli/blob/master/grappelli/static/admin/js/jquery.js

Eine andere Idee – haben Sie versucht, collectstatic auszuführen, ohne die ursprünglichen Admin–Dateien zu ignorieren?
python manage.py collectstatic --ignore django.contrib.admin

Ich hatte also genau das gleiche Problem ... Ich habe ein Projekt übernommen, das irgendwann vor Django 1.3 (derzeit 1.4) gestartet wurde. Es stellte sich heraus, dass ich die alte App „staticfiles“ und nicht „django.contrib.staticfiles“ verwendet hatte und mit collectstatic nicht alles bekam. Nach der Migration zu Djangos Statik funktionierte CollectStatic und es gab keine Admin-Probleme mehr!

@sehmaschine meine lösung war nicht 100%. Ich habe damit begonnen, Collectstatic zu verwenden und es funktioniert jetzt.

mein problem wurde wie folgt gelöst:

STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
'django.contrib.staticfiles.finders.FileSystemFinder',
)

Hallo, ich habe ein Problem. Ich habe eine JS-Datei für den Ziffernblock erstellt und wenn ich von meiner Anwendung aus anrufe, ruft es nicht an. Ich erhalte die Fehlermeldung „[Objekt Objekt] hat keine Methode. Jede Hilfe wird geschätzt. Vielen Dank im Voraus

Fand es! Stellen Sie sicher, dass Sie die alten Grappelli- und Admin-Dateien in Ihrem statischen Stammverzeichnis entfernen, und führen Sie dann erneut eine manage.py-Collectstatic durch, nachdem dies geändert wurde.

STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
'django.contrib.staticfiles.finders.FileSystemFinder',
}
Jetzt wurde angegeben, dass es ohne diesen Fehler funktioniert.

Ich hatte das gleiche Problem mit Filtern mit Gunicorn und Ngnix. Ich hatte AppDirectoriesFinder vor FileSystemFinder in STATICFILES_FINDERS , aber es hat immer noch nicht funktioniert. Was funktioniert hat, ist sicherzustellen, dass, wenn der Grappelli admin/js/ verwendet, er gezwungen wird, die Admin-Javascripts von Grappelli zu verwenden, nicht die Admin-Apps.

So sieht meine ngnix-Konfiguration jetzt aus:

   location /static/admin/js/ {
       root /usr/local/lib/python2.7/dist-packages/grappelli/;
 }
location /static/admin/media/ {
       root /usr/local/lib/python2.7/dist-packages/django/contrib/admin/static/admin/;
 }

 location /static/grappelli/ {
      root /usr/local/lib/python2.7/dist-packages/grappelli/;
    }

 location /static/ {
    # if asset versioning is used
    if ($query_string) {
        expires max;
      }
 }

@squarepegsys danke, deine Lösung hat auch mein Problem gelöst ...

Mit nginx sollten Sie wirklich nur ein location /static/ haben, das auf Ihren statischen Projektordner zeigt, und dann ./manage.py collectstatic DTRT lassen, wobei die in settings.py angegebene Sammlungsreihenfolge eingehalten wird. Auf diese Weise werden Ihre Nginx- und Runserver-Umgebung viel besser vergleichbar.

Dasselbe Problem, das seit mehr als 2 Jahren gemeldet wird. Alle vernünftigen Lösungen probiert. Kein Glück.

@sdillinger nun , ich konnte das seit über 2 Jahren nicht mehr reproduzieren. Ich bin mir ziemlich sicher, dass dies nicht mit Grappelli zusammenhängt, sondern mit Ihrem Server/Django-Setup.

Es scheint mir, dass dasselbe Symptom je nach Umgebung mehrere Ursachen hat.

In meinem Fall 'runserver' bestand die Lösung darin, STATICFILES_FINDERS wie oben vorgeschlagen umzukehren.

TATSÄCHLICH ... In meinem Fall hat STATICFILES_FINDERS das Problem nur teilweise gelöst und war tatsächlich ein Ablenkungsmanöver.

Was es für mich gelöst hat, war sicherzustellen, dass Grappelli vor debug_toolbar geladen wird:

INSTALLED_APPS = (
...
Grappelli,
'debug_toolbar',
...
)

Ich bin gerade zum zweiten Mal auf dieses Problem gestoßen, also habe ich mir einige Mühe gegeben, es zu untersuchen. Die folgende Diskussion basiert auf meinem Setup, aber es würde mich nicht im Geringsten überraschen, wenn andere genau im selben Boot sitzen.

sehmaschine kommentierte am 11
@sdillinger nun , ich konnte das seit über 2 Jahren nicht mehr reproduzieren. Ich bin mir ziemlich sicher, dass dies nicht mit Grappelli zusammenhängt, sondern mit Ihrem Server/Django-Setup.

@sehmaschine : Ich bin 100% bei dir - zumindest in meinem Fall hatte es nichts mit Grappelli selbst zu tun. Was das Reproduzieren (und Beheben) des Fehlers betrifft - vielleicht kann ich Ihnen dabei helfen ...


TL;DR

Eine einfache, funktionierende Lösung für dieses Problem. Zunächst zwei wichtige Hinweise:

http://django-grappelli.readthedocs.org/en/latest/quickstart.html#setup :

Öffnen Sie settings.py und fügen Sie grappelli zu Ihrem INSTALLED_APPS hinzu (vor django.contrib.admin ):

INSTALLED_APPS = (
    'grappelli',
    'django.contrib.admin',
)

https://docs.djangoproject.com/en/dev/ref/contrib/staticfiles/#django -admin-option---clear:

--clear

Löschen Sie die vorhandenen Dateien, bevor Sie versuchen, die Originaldatei zu kopieren oder zu verknüpfen.

Eine Einschränkung:

  • Die Verwendung --clear ist wie ein Vorschlaghammer; Es löscht alle statischen Dateien, die vom aktuellen Projekt nicht benötigt werden
  • Wenn Sie also dasselbe STATIC_ROOT für mehr als ein Projekt verwenden, lassen Sie diese Methode besser stehen – es gibt eine nuanciertere, weniger destruktive Methode, die weiter unten beschrieben wird
  • Verwenden Sie dies im Wesentlichen nicht für etwas anderes als zum Testen von , es sei denn, Sie möchten STATIC_ROOT neu erstellen

Nun die Schritte:

  1. Stellen Sie sicher, dass Sie 'grappelli' vor 'django.contrib.admin' in INSTALLED_APPS haben, wie in der obigen Referenz gezeigt
  2. Führen Sie python manage.py collectstatic --noinput --clear
  3. Test aus dem Browser, mit vollständigem Neuladen der Seite mit der Filterschaltfläche darauf – Fehler sollte behoben sein

Grundlegende Übersicht
Einleitung

Mit den unten gezeigten Schritten konnte ich den Fehler mit dem folgenden Setup zu 100% konsistent reproduzieren und beheben:

  1. Django 1.8
  2. DEBUG = False
  3. Nginx + Gunicorn über. Unix-Socket

In jedem Fall sollten die folgenden Schritte funktionieren, solange auf die statischen Dateien unter STATIC_ROOT zugegriffen wird.

Reproduzieren des Fehlers

Um den Fehler zu reproduzieren, beachten Sie, dass ich im Begriff bin, _den offiziellen Anweisungen wie oben gezeigt zu widersprechen_, da dies eine der Möglichkeiten ist, wie dieses Problem aufgetreten sein könnte.

  • Ändern Sie die Reihenfolge in INSTALLED_APPS , dh:
INSTALLED_APPS = (
    'django.contrib.admin',
    'grappelli',
)
  • Löschen Sie das Verzeichnis static/admin/js (oder benennen Sie es zumindest um).
  • Führen Sie python manage.py collectstatic --noinput aus, die Ausgabe sollte django/contrib/admin im Pfad anzeigen, wie zum Beispiel:
$ python manage.py collectstatic --noinput
Copying '.../django/contrib/admin/static/admin/js/inlines.js'
Copying '.../django/contrib/admin/static/admin/js/collapse.js'
Copying '.../django/contrib/admin/static/admin/js/related-widget-wrapper.js'
Copying '.../django/contrib/admin/static/admin/js/calendar.js'
Copying '.../django/contrib/admin/static/admin/js/collapse.min.js'
Copying '.../django/contrib/admin/static/admin/js/urlify.js'
Copying '.../django/contrib/admin/static/admin/js/core.js'
Copying '.../django/contrib/admin/static/admin/js/jquery.js'
Copying '.../django/contrib/admin/static/admin/js/actions.min.js'
Copying '.../django/contrib/admin/static/admin/js/jquery.init.js'
Copying '.../django/contrib/admin/static/admin/js/inlines.min.js'
Copying '.../django/contrib/admin/static/admin/js/actions.js'
Copying '.../django/contrib/admin/static/admin/js/jquery.min.js'
Copying '.../django/contrib/admin/static/admin/js/timeparse.js'
Copying '.../django/contrib/admin/static/admin/js/SelectBox.js'
Copying '.../django/contrib/admin/static/admin/js/prepopulate.min.js'
Copying '.../django/contrib/admin/static/admin/js/SelectFilter2.js'
Copying '.../django/contrib/admin/static/admin/js/LICENSE-JQUERY.txt'
Copying '.../django/contrib/admin/static/admin/js/prepopulate.js'
Copying '.../django/contrib/admin/static/admin/js/admin/RelatedObjectLookups.js'
Copying '.../django/contrib/admin/static/admin/js/admin/DateTimeShortcuts.js'

21 static files copied to '.../static', 593 unmodified.
  • Testen Sie vom Browser aus, mit vollständigem Neuladen der Seite mit der Filterschaltfläche darauf – Fehler sollte offensichtlich sein

Behebung des Fehlers

Die Auflösungsschritte sind fast gleich:

  • Korrigieren Sie die Reihenfolge in INSTALLED_APPS , dh:
INSTALLED_APPS = (
    'grappelli',
    'django.contrib.admin',
)
  • Löschen Sie das Verzeichnis static/admin/js (oder benennen Sie es zumindest um).
  • Führen Sie python manage.py collectstatic --noinput aus, die Ausgabe sollte grappelli im Pfad anzeigen, wie zum Beispiel:
$ python manage.py collectstatic --noinput
Copying '.../grappelli/static/admin/js/SelectFilter2.js'
Copying '.../grappelli/static/admin/js/collapse.min.js'
Copying '.../grappelli/static/admin/js/actions.min.js'
Copying '.../grappelli/static/admin/js/inlines.js'
Copying '.../grappelli/static/admin/js/urlify.js'
Copying '.../grappelli/static/admin/js/related-widget-wrapper.js'
Copying '.../grappelli/static/admin/js/collapse.js'
Copying '.../grappelli/static/admin/js/jquery.js'
Copying '.../grappelli/static/admin/js/jquery.min.js'
Copying '.../grappelli/static/admin/js/calendar.js'
Copying '.../grappelli/static/admin/js/prepopulate.js'
Copying '.../grappelli/static/admin/js/prepopulate.min.js'
Copying '.../grappelli/static/admin/js/actions.js'
Copying '.../grappelli/static/admin/js/core.js'
Copying '.../grappelli/static/admin/js/LICENSE-JQUERY.txt'
Copying '.../grappelli/static/admin/js/timeparse.js'
Copying '.../grappelli/static/admin/js/SelectBox.js'
Copying '.../grappelli/static/admin/js/inlines.min.js'
Copying '.../grappelli/static/admin/js/jquery.init.js'
Copying '.../grappelli/static/admin/js/admin/RelatedObjectLookups.js'
Copying '.../grappelli/static/admin/js/admin/DateTimeShortcuts.js'

21 static files copied to '.../static', 593 unmodified.
  • Test aus dem Browser, mit vollständigem Neuladen der Seite mit der Filterschaltfläche darauf – Fehler sollte behoben sein
Warum tritt das Problem auf?
  • collectstatic erhält die static/admin/js -Dateien von 'django.contrib.admin' statt von 'grappelli'
Wie konnte das passieren?
  1. Wie in den oben gezeigten Schritten, könnten die INSTALLED_APPS falsch bestellt worden sein
  2. Eine andere Ursache könnte sein, dass collectstatic für 'django.contrib.admin' ausgeführt wurde, bevor 'grappelli' jemals installiert wurde
  3. ...

Weitere Details

Die folgenden Punkte stammen aus meinen grundlegenden Untersuchungen und sind keine aussagekräftigen Erfahrungen. Ich würde mich sehr freuen, wenn ein Django-Experte vorbeikommt und mir sagt, dass ich falsch liege und es bessere Erklärungen und Lösungen gibt. Ich möchte einfach robustere, stabilere Apps entwickeln. Bitte mit einer Prise Salz einnehmen.

Alles hängt davon ab, wie collectstatic funktioniert

https://docs.djangoproject.com/en/dev/ref/contrib/staticfiles/#collectstatic :

Bei nachfolgenden collectstatic Läufen (wenn STATIC_ROOT nicht leer ist) werden Dateien nur dann kopiert, wenn sie einen geänderten Zeitstempel haben, der größer ist als der Zeitstempel der Datei in STATIC_ROOT . Wenn Sie also eine Anwendung aus INSTALLED_APPS entfernen, ist es eine gute Idee, die Option --clear zu verwenden, um veraltete statische Dateien zu entfernen.

  • Hervorhebung oben ist von mir
  • Mögliches Szenario:

    • Falsche static/admin/js vorhanden

    • Der Benutzer hat die Reihenfolge in INSTALLED_APPS korrigiert

    • Änderungsdaten am System sind jedoch ungünstig, dh:

    • grappelli/static/admin/js < static/admin/js

  • Das Ergebnis wird in etwa so aussehen:
$ python manage.py collectstatic --noinput

0 static files copied to '.../static', 614 unmodified.
  • Ändern Sie das Änderungsdatum für eine der Quelldateien, um anzuzeigen, dass sie dann gesammelt wird:
$ touch .../grappelli/static/admin/js/jquery.init.js 
$ python manage.py collectstatic --noinput
Copying '.../grappelli/static/admin/js/jquery.init.js'

1 static file copied to '.../static', 613 unmodified.
  • Wahrscheinlich weitaus angemessener, Änderungsdaten im static -Verzeichnis zu ändern als in den Quelldateien, z.
$ touch -d 2000-01-01 .../static/admin/js/jquery.init.js 
$ python manage.py collectstatic --noinput
Copying '.../grappelli/static/admin/js/jquery.init.js'

1 static file copied to '.../static', 613 unmodified.
  • Also für das gesamte Verzeichnis static/admin/js :
$ find .../static/admin/js -type f -exec touch -d 2000-01-01 {} \;
$ python manage.py collectstatic --noinput
Copying '.../grappelli/static/admin/js/SelectFilter2.js'
Copying '.../grappelli/static/admin/js/collapse.min.js'
Copying '.../grappelli/static/admin/js/actions.min.js'
Copying '.../grappelli/static/admin/js/inlines.js'
Copying '.../grappelli/static/admin/js/urlify.js'
Copying '.../grappelli/static/admin/js/related-widget-wrapper.js'
Copying '.../grappelli/static/admin/js/collapse.js'
Copying '.../grappelli/static/admin/js/jquery.js'
Copying '.../grappelli/static/admin/js/jquery.min.js'
Copying '.../grappelli/static/admin/js/calendar.js'
Copying '.../grappelli/static/admin/js/prepopulate.js'
Copying '.../grappelli/static/admin/js/prepopulate.min.js'
Copying '.../grappelli/static/admin/js/actions.js'
Copying '.../grappelli/static/admin/js/core.js'
Copying '.../grappelli/static/admin/js/LICENSE-JQUERY.txt'
Copying '.../grappelli/static/admin/js/timeparse.js'
Copying '.../grappelli/static/admin/js/SelectBox.js'
Copying '.../grappelli/static/admin/js/inlines.min.js'
Copying '.../grappelli/static/admin/js/jquery.init.js'
Copying '.../grappelli/static/admin/js/admin/RelatedObjectLookups.js'
Copying '.../grappelli/static/admin/js/admin/DateTimeShortcuts.js'

21 static files copied to '.../static', 593 unmodified.
  • In Bezug auf die eingangs erwähnte Option --clear ; einige Beobachtungen:

    • Es funktioniert auf jeden Fall...

    • ... aber es ist eine sehr aggressive Lösung, die dazu führen kann, dass statische Dateien entfernt werden, die zu anderen Projekten gehören, die dasselbe STATIC_ROOT teilen

    • Als generelle Empfehlung also nicht wirklich geeignet

Auswirkungen

Dieses seit über 3 Jahren aktive Problem ist ein Beweis für diese collectstatic -Funktionalität. Was es noch köstlicher macht, ist, dass sich der "Fehler" unter den richtigen Bedingungen selbst lösen kann. Ein Beispiel:

  • Neben dem Ausprobieren verschiedener Lösungen aktualisiert der Benutzer Grappelli und führt neue static/admin/js -Quelldateien ein, die neuere Änderungsdaten aufweisen als die derzeit in STATIC_ROOT

    • Doch der Filterknopf verweigert hartnäckig seine Arbeit

  • Zu einem späteren Zeitpunkt führt der Benutzer collectstatic aus

    • Plötzlich funktioniert die Filtertaste wieder

In einer idealen Welt:

  • Eine Zwischeneinstellung für collectstatic , etwa --replace oder --overwrite oder --ignore-timestamps
  • Grundsätzlich:

    • Finden Sie alle statischen Dateien so, wie es derzeit der Fall ist

    • Kopieren Sie sie unabhängig von vorhandenen statischen Dateien

    • Berühren Sie keine anderen statischen Dateien in STATIC_ROOT

Wenn diese ideale Welt bereits existiert, lassen Sie es mich bitte wissen. Vielleicht könnte sogar dieses Thema endlich geschlossen werden!

"Die Akte des Schicksals"

Schließlich wäre diese ganze Diskussion nicht vollständig, ohne den Täter zu identifizieren und die genaue Codezeile zu finden, die so viel Schmerz verursacht hat!

Ich habe es bereits oben heimlich erwähnt ... und es ist ...:

  • static/admin/js/jquery.init.js !!! Aber das hattet ihr alle schon herausgefunden, oder?!

Wenn Grappelli den collectstatic -Kampf gewinnt, dann werden Sie feststellen, dass es Folgendes enthält:

// dropped
// not used in grappelli
// kept this file to prevent 404

Doch wenn Django-Admin trumpft, werden Sie feststellen:

/* Puts the included jQuery into our own namespace using noConflict and passing
 * it 'true'. This ensures that the included jQuery doesn't pollute the global
 * namespace (i.e. this preserves pre-existing values for both window.$ and
 * window.jQuery).
 */
var django = django || {};
django.jQuery = jQuery.noConflict(true);
  • Also, nach all dem nur eine 2-zeilige js -Datei
  • Und tatsächlich ist die letzte Zeile der Störenfried – kommentieren Sie sie aus und der Filter-Button funktioniert wieder

NB: Ich befürworte in keiner Weise diese Methode, um die Filterschaltfläche wieder zum Laufen zu bringen – ich teile diese Erkenntnis nur für die Neugierigen da draußen.

@myii Vielen Dank für die Recherche und die sehr ausführliche Erklärung. Was Sie sagen, macht in der Tat Sinn (immer noch lustig, dass ich bei keinem unserer Projekte auf dieses Problem gestoßen bin).

@myii Danke. Ich habe die Schritte so zu meiner Bereitstellung in Ansible hinzugefügt und dann (leider) Collectstatic erneut ausgeführt:

- name: 'manage.py collectstatic'
  django_manage: app_path={{common_htdocs_dir}}/fos
                 command=collectstatic
                 settings=fos.settings
                 virtualenv={{common_htdocs_dir}}/fos-venv
  when: code.changed or code_deps.changed or settings.changed
  tags:
    - fos
    - collectstatic

# Next two steps, credits to <strong i="7">@myii</strong>
# https://github.com/sehmaschine/django-grappelli/issues/214#issuecomment-158576652
- name: "Move Django's admin assets to avoid conflict with Grapelli's"
  command: mv {{common_htdocs_dir}}/fos/static/admin/js {{common_htdocs_dir}}/fos/static/admin/js-already-moved creates={{common_htdocs_dir}}/fos/static/admin/js-already-moved
  tags:
    - fos
    - collectstatic
    - grapelli

# Using command directly so ----no-post-process can be passed, for extra speed
- name: "Re-run collectstatic to replace admin assets with Grapelli's"
  command: '{{common_htdocs_dir}}/fos-venv/bin/python ./manage.py collectstatic --no-color --noinput --no-post-process chdir={{common_htdocs_dir}}/fos'
  tags:
    - fos
    - collectstatic

Glücklicherweise muss Grapelli nicht nachbearbeitet werden, und nur JS ist betroffen.

Ich habe den gleichen Fehler, fügte dies hinzu und es funktionierte
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
'django.contrib.staticfiles.finders.FileSystemFinder',
}

;)

Hallo zusammen, Django 1.9.8 / Grappelli 2.8., dieses Problem tritt immer noch auf, sogar in der Produktion mit der Einrichtung statischer Dateien.

Gibt es dafür eine "einfache" Lösung? Beachten Sie, dass in meinem Projekt admin js zu keinem Zeitpunkt geladen wird.

marcooo,

Ist grappelli zuerst in INSTALLED_APPS ?

INSTALLED_APPS = (
    'grappelli',
    'django.contrib.admin',
)

Hast du collectstatic ausgeführt? Was ist die Ausgabe? In welchem ​​Dateisystempfad wird gesammelt? Wie werden Ihre statischen Dateien bereitgestellt? Von welchem ​​Dateisystempfad werden sie bereitgestellt? Haben Sie Ihren Browser-Cache und alle Server-Caches für Ihre statischen Dateien geleert?

@marcoooo Basierend auf meiner langen Antwort oben und dem Follow-up von @Tatsh habe ich eine Zusammenfassung in zwei Schritten für Sie:

  1. Löschen/verschieben Sie das Verzeichnis static/admin/js
  2. Führen Sie erneut collectstatic aus

Solange Sie die richtige Reihenfolge haben, wie von @ecederstrand angegeben , können Sie loslegen.

Hallo zusammen, danke für eure schnelle Antwort!

  • Bestellen in Apps ist ok (da ich in umgekehrter Reihenfolge den Grappelli-Stil überhaupt nicht bekomme)
  • Ich starte Collectstatic, Admin-Dateien kommen wieder (also habe ich den Ordner gelöscht)
  • path ist (relativ zu project ~/staticfiles/) Ich denke, meine conf ist korrekt, da alle anderen statischen Daten gut bedient werden (keine Aktualisierung der URL-Muster in meiner urls.py-Konfiguration, wie in Django doc empfohlen)

Habe dieses Problem immer noch.

Installierte Django-Pakete:

django-admin-sortierbar (2.0.18)
django-authtools (1.5.0)
Django-Bootstrap-Designs (3.3.6)
Django-Klammern (1.9.0)
django-ckeditor (5.1.0)
Django-Cors-Header (1.1.0)
Django-Länder (3.4.1)
Django-Crispy-Formulare (1.6.0)
django-crontab (0.7.1)
Django-Debug-Toolbar (1.5)
django-eav (0.9.2, /home/marc/.virtualenvs/waves1/src/django-eav)
Django-Umgebung (0.4.0)
Django Grappelli (2.8.1)
django-ipware (1.1.5)
django-jquery (1.12.2)
django-jquery-ui (1.11.4.1)
django-log-file-viewer (0.9)
Django-Mail-Template (2.6.2)
django-mptt (0.8.4)
Django-Multiupload (0.5.1)
django-nested-admin (3.0.8)
Django-polymorph (1.0.1)
Django-Registrierung (2.1.2)
django-smart-selects (1.2.2)
django-Tabbed-Admin (1.0.0)
Djangorestframework (3.4.0)
djangorestframework-jwt (1.8.0)
djangorestframework-xml (1.3.0)
drfdocs (0.0.11)

Ausführung auf Apache mit statischem Serving-Setup:

<Verzeichnis [ABSOLUTE_PATH_TO_WAVES_INSTALL_DIR]/src/waves_services>
Optionen FollowSymLinks-Indizes
<Dateien wsgi.py>
Erfordern alle gewährt
</Dateien>
</Verzeichnis>
<Standort /statisch>
SetHandler Keine
</Standort>
<Ort /Medien>
SetHandler Keine
</Standort>
Alias ​​/media [ABSOLUTE_PATH_TO_WAVES_INSTALL_DIR]/media
Alias ​​/static [ABSOLUTE_PATH_TO_WAVES_INSTALL_DIR]/staticfiles

Um zu helfen: Die Funktion actions() scheint in actions.js deklariert zu sein, aber diese Datei wird nicht in meine Admin-Seiten geladen (ich erbe base_site.html in meinem Projekt). Soll ich diese Aufnahme in meiner Vorlage erzwingen? Ich habe keine Spur dieses Imports in irgendeiner Vorlage in Grappelli-Quellen gesehen.

ICH HABS !

Für zukünftige Referenzen könnte es hilfreich sein. (Aber sollte diese Datei nicht in der Grappelli-Datei base_site.html enthalten sein?)

Ich starte Collectstatic, Admin-Dateien kommen wieder (also habe ich den Ordner gelöscht)

@marcoooo Nur den Ordner vor collectstatic löschen. Wenn Sie collectstatic erneut ausführen, erzeugt es die richtigen Dateien, _die Sie behalten müssen_.

Hallo, alle miteinander!
Wir haben hier das gleiche Problem, aber mit einem anderen Szenario:

  • 2 virtualenvs gepackt mit RPM
  • Einer von ihnen hat Grappelli
    Unsere statischen Dateien werden über die virtuelle Umgebung geteilt und collectstatic wird zuerst für diejenigen ausgeführt, die kein Grappelli haben.
    Der Zeitstempel der Dateien ist das Datum der RPM-Erstellung, sodass die statischen Admin-Dateien von Grappellis und Djando fast dieselbe Datumszeit haben.

Wenn jemand anderes dieses Szenario hat, passen Sie auf. Unsere Lösung (vorerst) besteht darin, die statischen Dateien von Grappelli manuell nach collectstatic zu kopieren.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen