Dies wäre eine gute Funktion, um zu fragen, denke ich.
Als Workaround können Sie die Tatsache nutzen, dass eine InlineModelAdmin
einer ModelAdmin
sehr ähnlich ist. Beide erweitern BaseModelAdmin
.
Erben von beiden StackedInline
und ModelAdmin
sollte nicht zu viel aufeinander treffen.
Das einzige Problem ist, dass beide __init__()
Methoden 2 Positionsargumente nehmen und super().__init__()
ohne Argumente aufrufen. So was auch immer das Erbe Ordnung, wird es zum Glück mit TypeError: __init__() missing 2 required positional arguments: 'parent_model' and 'admin_site'
scheitern, der InlineModelAdmin.__init__()
Methode, die, die wir interessiert sind, ist nicht wirklich ausführliche noch komplex (nicht zu viele super().__init__()
Anrufe in Kaskade). Hier
ist, wie es aussieht in Django 1.9:
def __init__(self, parent_model, admin_site):
self.admin_site = admin_site
self.parent_model = parent_model
self.opts = self.model._meta
self.has_registered_model = admin_site.is_registered(self.model)
super(InlineModelAdmin, self).__init__()
if self.verbose_name is None:
self.verbose_name = self.model._meta.verbose_name
if self.verbose_name_plural is None:
self.verbose_name_plural = self.model._meta.verbose_name_plural
Und hier ist es, was seine Eltern (BaseModelAdmin
) sehen aus wie in Django 1.9
def __init__(self):
overrides = FORMFIELD_FOR_DBFIELD_DEFAULTS.copy()
overrides.update(self.formfield_overrides)
self.formfield_overrides = overrides
Nun wollen sie es alle zusammen:
from django.contrib.admin.options import FORMFIELD_FOR_DBFIELD_DEFAULTS
# User Admin, with Profile attached
class ProfileInline(OSMGeoAdmin, admin.StackedInline):
model = Profile
can_delete = False
verbose_name_plural = 'Profile' # As only one is displayed in this view
def __init__(self, parent_model, admin_site):
self.admin_site = admin_site
self.parent_model = parent_model
self.opts = self.model._meta
self.has_registered_model = admin_site.is_registered(self.model)
overrides = FORMFIELD_FOR_DBFIELD_DEFAULTS.copy()
overrides.update(self.formfield_overrides)
self.formfield_overrides = overrides
if self.verbose_name is None:
self.verbose_name = self.model._meta.verbose_name
if self.verbose_name_plural is None:
self.verbose_name_plural = self.model._meta.verbose_name_plural
class UserAdmin(UserAdmin):
inlines = (
ProfileInline,
)
admin.site.unregister(User)
admin.site.register(User, UserAdmin)
Es ist nicht wirklich eine befriedigende Lösung als es erfordert das Kopieren/Einfügen von Code aus Django, der innerhalb der von Ihnen verwendeten Version von Django anders sein kann. Bei der Aktualisierung von Django könnte es schwierig sein, sie beizubehalten. Es sollte jedoch funktionieren, bis es in Django als Mix-In oder als InlineModelAdmin
enthalten ist.
Hinweis: Die Code-Schnipsel oben genommen werden von Django 1,9, sollten Sie Github Tags durchsuchen Sie die Schnipsel zu finden, um Ihre Version entspricht.