django - GeoDjango:我可以在User Admin的内联中使用OSMGeoAdmin吗?

标签 django django-admin openstreetmap geodjango

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吗?

最佳答案

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

作为解决方法,您可以利用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时可能很难维护。但是,它应该可以工作,直到它作为混入或InlineModelAdmin包含在Django中为止。

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

关于django - GeoDjango:我可以在User Admin的内联中使用OSMGeoAdmin吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32037375/

相关文章:

python - Django 检查复选框是否被选中

python - 在 Django 管理屏幕中删除 "add another"

django - 如何在 DJango 管理界面中显示外键反向查找列表?

java - 创建一个可以使用开放街道 map 跟踪位置的应用程序

html - 如何将文本输入保存为 HTML 和 Django 中的文件

python - Virtualenv 无法运行

python - 类型对象 'Notification' 没有属性 'object'

css - django admin 没有显示一些 css 和表单功能

java - 使用 STAX API 进行 XML 解析

openstreetmap - Ubuntu 上带有 Mapsforge 插件的 Osmosis。我做对了吗?