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
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 ...
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 ...
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 Siegrappelli
zu IhremINSTALLED_APPS
hinzu (vordjango.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:
--clear
ist wie ein Vorschlaghammer; Es löscht alle statischen Dateien, die vom aktuellen Projekt nicht benötigt werdenSTATIC_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 wirdSTATIC_ROOT
neu erstellenNun die Schritte:
'grappelli'
vor 'django.contrib.admin'
in INSTALLED_APPS
haben, wie in der obigen Referenz gezeigtpython manage.py collectstatic --noinput --clear
Mit den unten gezeigten Schritten konnte ich den Fehler mit dem folgenden Setup zu 100% konsistent reproduzieren und beheben:
DEBUG = False
In jedem Fall sollten die folgenden Schritte funktionieren, solange auf die statischen Dateien unter STATIC_ROOT
zugegriffen wird.
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.
INSTALLED_APPS
, dh:INSTALLED_APPS = (
'django.contrib.admin',
'grappelli',
)
static/admin/js
(oder benennen Sie es zumindest um).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.
Die Auflösungsschritte sind fast gleich:
INSTALLED_APPS
, dh:INSTALLED_APPS = (
'grappelli',
'django.contrib.admin',
)
static/admin/js
(oder benennen Sie es zumindest um).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.
collectstatic
erhält die static/admin/js
-Dateien von 'django.contrib.admin'
statt von 'grappelli'
INSTALLED_APPS
falsch bestellt worden seincollectstatic
für 'django.contrib.admin'
ausgeführt wurde, bevor 'grappelli'
jemals installiert wurdeDie 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.
collectstatic
funktionierthttps://docs.djangoproject.com/en/dev/ref/contrib/staticfiles/#collectstatic :
Bei nachfolgenden
collectstatic
Läufen (wennSTATIC_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 inSTATIC_ROOT
. Wenn Sie also eine Anwendung ausINSTALLED_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.
$ 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.
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.
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.
--clear
; einige Beobachtungen:STATIC_ROOT
teilenDieses 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:
static/admin/js
-Quelldateien ein, die neuere Änderungsdaten aufweisen als die derzeit in STATIC_ROOT
collectstatic
ausIn einer idealen Welt:
collectstatic
, etwa --replace
oder --overwrite
oder --ignore-timestamps
STATIC_ROOT
Wenn diese ideale Welt bereits existiert, lassen Sie es mich bitte wissen. Vielleicht könnte sogar dieses Thema endlich geschlossen werden!
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);
js
-DateiNB: 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:
static/admin/js
collectstatic
ausSolange Sie die richtige Reihenfolge haben, wie von @ecederstrand angegeben , können Sie loslegen.
Hallo zusammen, danke für eure schnelle Antwort!
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.
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:
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.