Einstellung self.exclude
tut als @ steve-Hecht erwähnt, machen die ganze SubSectionAdmin
Singleton seine ausschließen Eigenschaft ändern. Ein Singleton ist eine Klasse, die dieselbe Instanz jedes Mal erneut verwendet, wenn die Klasse instanziiert wird. Daher wird eine Instanz nur bei der ersten Verwendung des Konstruktors erstellt, und die nachfolgende Verwendung des Konstruktors gibt dieselbe Instanz zurück. Eine ausführlichere Beschreibung finden Sie unter wiki page. Dies bedeutet, dass wenn Sie Code zum Ausschließen des Felds bei Änderung schreiben, dass wenn Sie zuerst ein Element hinzufügen, das Feld dort sein wird, aber wenn Sie ein Element zur Änderung öffnen, wird das Feld für Ihre folgenden ausgeschlossen Besuche auf der Hinzufügen-Seite.
Der einfachste Weg, eine pro Anfrage Verhalten zu erreichen, ist get_fields
und Test auf dem obj
Argument zu verwenden, die None
ist, wenn wir ein Objekt und eine Instanz eines Objekts, wenn wir ein Objekt ändern sich hinzufügen. Die Methode get_fields
ist von Django 1.7 erhältlich.
class SubSectionAdmin(admin.ModelAdmin):
def get_fields(self, request, obj=None):
fields = super(SubSectionAdmin, self).get_fields(request, obj)
if obj: # obj will be None on the add page, and something on change pages
fields.remove('field')
return fields
Update:
Bitte beachten Sie, dass get_fields
ein Tupel zurückgeben kann, so dass Sie fields
in eine Liste umwandeln müssen Elemente zu entfernen. Möglicherweise tritt auch ein Fehler auf, wenn der Feldname, den Sie entfernen möchten, nicht in der Liste enthalten ist. Daher kann es in einigen Fällen, in denen Sie andere Faktoren, die Felder ausschließen, besser sein, einen Satz umfasst nicht zu bauen und entfernen, um eine Liste Verständnis mit:
class SubSectionAdmin(admin.ModelAdmin):
def get_fields(self, request, obj=None):
fields = list(super(SubSectionAdmin, self).get_fields(request, obj))
exclude_set = set()
if obj: # obj will be None on the add page, and something on change pages
exclude_set.add('field')
return [f for f in fields if f not in exclude_set]
Alternativ können Sie auch eine deepcopy
des Ergebnisses machen in der get_fieldsets
Methode, die Ihnen in anderen Anwendungsfällen Zugriff auf einen besseren Kontext zum Ausschließen von Daten geben kann. Am offensichtlichsten ist dies nützlich, wenn Sie auf den Namen des Feldsatzes reagieren müssen.Auch Dies ist die einzige Möglichkeit zu gehen, wenn Sie tatsächlich Feldgruppen verwenden, da dies den Anruf an get_fields
weglassen wird.
from copy import deepcopy
class SubSectionAdmin(admin.ModelAdmin):
def get_fieldsets(self, request, obj=None):
"""Custom override to exclude fields"""
fieldsets = deepcopy(super(SubSectionAdmin, self).get_fieldsets(request, obj))
# Append excludes here instead of using self.exclude.
# When fieldsets are defined for the user admin, so self.exclude is ignored.
exclude =()
if not request.user.is_superuser:
exclude += ('accepted_error_margin_alert', 'accepted_error_margin_warning')
# Iterate fieldsets
for fieldset in fieldsets:
fieldset_fields = fieldset[1]['fields']
# Remove excluded fields from the fieldset
for exclude_field in exclude:
if exclude_field in fieldset_fields:
fieldset_fields = tuple(field for field in fieldset_fields if field != exclude_field) # Filter
fieldset[1]['fields'] = fieldset_fields # Store new tuple
return fieldsets
self.exclude = ('Feld',) – falko
Was ist, wenn das Feld ein benutzerdefiniertes Feld im Admin-Formular ist? –
Siehe die Antworten unten, warum dies gefährlich ist und nicht der richtige Weg. Die Admin-Objekte sind Singletons. Das Setzen von self.exclude ändert den Status von SubSectionAdmin für nachfolgende add_view-Aufrufe. – aggieNick02