2015-08-16 8 views
8

Profile enthält eine PointField. Ich habe OSMGeoAdmin im ProfileAdmin verwendet, hier:GeoDjango: Kann ich OSMGeoAdmin in einem Inline im User Admin verwenden?

class ProfileAdmin(admin.OSMGeoAdmin): 
    model = Profile 

aber kann nicht herausfinden, wie es für die Anzeige im Admin in einem Inline zu verwenden. Ich habe derzeit diese Einrichtung wie folgt:

# User Admin, with Profile attached 
class ProfileInline(admin.StackedInline): 
    model = Profile 
    can_delete = False 
    verbose_name_plural = 'Profile' # As only one is displayed in this view 

class UserAdmin(UserAdmin): 
    inlines = (
     ProfileInline, 
    ) 

admin.site.unregister(User) 
admin.site.register(User, UserAdmin) 

Ist es möglich, Klasse OSMGeoAdmin in dieser Situation zu verwenden?

Antwort

4

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.