Profile
包含一个PointField
。我在ProfileAdmin中使用过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吗?
最佳答案
我猜这将是一个很好的功能。
作为解决方法,您可以利用InlineModelAdmin
与ModelAdmin
非常相似的事实。两者都扩展BaseModelAdmin
。
从StackedInline
和ModelAdmin
继承不应冲突太多。
唯一的问题是,这两个__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时可能很难维护。但是,它应该可以工作,直到它作为混入或
InlineModelAdmin
包含在Django中为止。注意:上面的代码段摘自Django 1.9 ,您应该浏览github标记以找到与您的版本相对应的代码段。
关于django - GeoDjango:我可以在User Admin的内联中使用OSMGeoAdmin吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32037375/