2015-08-16 52 views
8

Profile包含PointField。我用OSMGeoAdmin在ProfileAdmin,在这里:GeoDjango:我可以在用户管理中内联使用OSMGeoAdmin吗?

class ProfileAdmin(admin.OSMGeoAdmin): 
    model = Profile 

但无法弄清楚如何在UserAdmin用它内嵌显示。我目前有这样的设置如下:

# 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) 

在这种情况下可以使用OSMGeoAdmin类吗?

回答

4

这将是一个很好的功能,要求我猜。

作为一种解决方法,您可以充分利用InlineModelAdminModelAdmin非常相似的事实。两者延伸BaseModelAdmin

StackedInlineModelAdmin继承不应该冲突太多。

唯一的问题是两个__init__()方法都带2个位置参数并且不带参数调用super().__init__()。所以,无论继承顺序,它将失败,TypeError: __init__() missing 2 required positional arguments: 'parent_model' and 'admin_site'

幸运的是,InlineModelAdmin.__init__()方法中,一个我们感兴趣的,是不是真的冗长,也不需要复杂(级联没有太多super().__init__()调用)。

这里是什么样子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 

而且这里是它的父(BaseModelAdmin)看起来像in Django 1.9

def __init__(self): 
    overrides = FORMFIELD_FOR_DBFIELD_DEFAULTS.copy() 
    overrides.update(self.formfield_overrides) 
    self.formfield_overrides = overrides 

现在,让我们把它放在一起:

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) 

这不是一个真正令人满意的解决方案,因为它需要从Django复制/粘贴一些代码,这些代码在您使用的Django版本中可能会有所不同,并且在升级Django时可能会很痛苦。然而,它应该工作,直到它被包括在Django中作为混合或作为InlineModelAdmin

注意:上面的代码片段取自Django 1.9,您应该浏览github标签以查找与您的版本相对应的代码段。

相关问题