Wie kann ich ein Modell in der Administrationsoberfläche vollständig schreibgeschützt machen? Es handelt sich um eine Art Protokolltabelle, in der ich die Administratorfunktionen zum Suchen, Sortieren, Filtern usw. verwende, das Protokoll jedoch nicht geändert werden muss.
Für den Fall , der wie folgt aussieht ein Duplikat, hier ist nicht , was ich zu tun werde versuchen:
- Ich suche nicht nach schreibgeschützten Feldern (selbst wenn Sie jedes Feld schreibgeschützt machen, können Sie immer noch neue Datensätze erstellen)
- Ich möchte keinen schreibgeschützten Benutzer erstellen : Jeder Benutzer sollte schreibgeschützt sein.
django
django-admin
readonly
Steve Bennett
quelle
quelle
has_view_permission
wurde schließlich in Django 2.1 implementiert. Siehe auch stackoverflow.com/a/51641149 unten.Antworten:
Siehe https://djangosnippets.org/snippets/10539/
templates / admin / view.html
templates / admin / view.html (für Grappelli)
quelle
Model
oder für dieModelAdmin
?ModelAdmin
.Der Administrator dient zum Bearbeiten und nicht nur zum Anzeigen (Sie finden keine Berechtigung zum Anzeigen). Um das zu erreichen, was Sie wollen, müssen Sie das Hinzufügen, Löschen und das Lesen aller Felder verbieten:
(Wenn Sie das Ändern verbieten, werden Sie die Objekte nicht einmal sehen können)
Für einen nicht getesteten Code, der versucht, das Setzen aller schreibgeschützten Felder zu automatisieren, siehe meine Antwort auf gesamte Modell als schreibgeschützt angesehen
EDIT: auch ungetestet aber habe mir gerade meinen LogEntryAdmin angesehen und es hat
Ich weiß nicht, ob das in allen Fällen funktioniert.
BEARBEITEN: QuerySet.delete () kann weiterhin Objekte in großen Mengen löschen. Um dies zu umgehen, stellen Sie Ihren eigenen "Objekt" -Manager und die entsprechende QuerySet-Unterklasse bereit, die nicht gelöscht wird - siehe Überschreiben von QuerySet.delete () in Django
quelle
Hier sind zwei Klassen, die ich verwende, um ein Modell zu erstellen, und / oder dessen Inlines schreibgeschützt sind.
Für Model Admin:
Für Inlines:
quelle
has_add_permission
inReadOnlyAdmin
nimmt nur Anfrage als ParameterWenn Sie möchten, dass der Benutzer merkt, dass er es nicht bearbeiten kann, fehlen bei der ersten Lösung 2 Teile. Sie haben die Löschaktion entfernt!
Zweitens: Die schreibgeschützte Lösung funktioniert problemlos bei einfachen Modellen. Es funktioniert jedoch NICHT , wenn Sie ein geerbtes Modell mit Fremdschlüsseln haben. Leider kenne ich die Lösung dafür noch nicht. Ein guter Versuch ist:
Ganzes Modell als schreibgeschützt
Aber es funktioniert auch nicht bei mir.
Und ein letzter Hinweis: Wenn Sie über eine umfassende Lösung nachdenken möchten, müssen Sie durchsetzen, dass jede Inline auch schreibgeschützt sein muss.
quelle
Eigentlich können Sie diese einfache Lösung ausprobieren:
actions = None
: Vermeidet das Anzeigen der Dropdown-Liste mit der Option "Ausgewählte löschen ..."list_display_links = None
: vermeidet das Klicken in Spalten, um dieses Objekt zu bearbeitenhas_add_permission()
Durch die Rückgabe von False wird vermieden, dass neue Objekte für dieses Modell erstellt werdenquelle
Dies wurde in Django 2.1 hinzugefügt, das am 01.08.18 veröffentlicht wurde!
ModelAdmin.has_view_permission()
ist genau wie die vorhandene has_delete_permission, has_change_permission und has_add_permission. Sie können darüber in den Dokumenten hier lesenAus den Versionshinweisen:
quelle
Wenn die akzeptierte Antwort bei Ihnen nicht funktioniert, versuchen Sie Folgendes:
quelle
Das Kompilieren der hervorragenden Antworten von @darklow und @josir sowie das Hinzufügen von etwas mehr zum Entfernen der Schaltflächen "Speichern" und "Speichern und fortfahren" führt zu (in Python 3-Syntax):
und dann benutzt du gerne
Ich habe dies nur mit Django 1.11 / Python 3 versucht.
quelle
Die akzeptierte Antwort sollte funktionieren, dies behält jedoch auch die Anzeigereihenfolge der schreibgeschützten Felder bei. Mit dieser Lösung müssen Sie das Modell auch nicht fest codieren.
quelle
Mit Django 2.2 mache ich das so:
quelle
readonly_fields
undactions
Mit Django 2.2 kann schreibgeschützter Administrator so einfach sein wie:
quelle
Ich hatte die gleiche Anforderung, als ich alle Felder für bestimmte Benutzer in Django Admin schreibgeschützt machen musste. Am Ende nutzte ich das Django-Modul "Django-Admin-View-Berechtigung", ohne meinen eigenen Code zu rollen. Wenn Sie eine genauere Steuerung benötigen, um explizit zu definieren, welche Felder vorhanden sind, müssen Sie das Modul erweitern. Sie können das Plugin in Aktion hier überprüfen
quelle
schreibgeschützt => Ansichten anzeigen
pipenv install django-admin-view-permission
6666
ok.have Spaß mit der "Ansichten" Erlaubnis
quelle
Ich habe eine generische Klasse geschrieben, um die ReadOnly-Ansicht abhängig von den Benutzerberechtigungen, einschließlich Inlines, zu verarbeiten.
In models.py:
In admin.py:
Dann können wir unsere Klassen in admin.py normal erben:
quelle