Str*_*ire 8 django django-admin geodjango openstreetmap
Profile包含一个PointField.我在ProfileAdmin中使用过OSMGeoAdmin,这里:
class ProfileAdmin(admin.OSMGeoAdmin):
model = Profile
Run Code Online (Sandbox Code Playgroud)
但无法弄清楚如何在内联中使用它在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)
Run Code Online (Sandbox Code Playgroud)
在这种情况下是否可以使用类OSMGeoAdmin?
PointField由于 Django 管理字段使用小部件,因此您可以使用formfield_overrides覆盖自动设置的小部件。在这种情况下,您可以覆盖所有PointField实例以使用OSMWidget类,如下所示:
from django.contrib.gis.forms.widgets import OSMWidget
class ProfileInline(admin.StackedInline):
model = Profile
can_delete = False
verbose_name_plural = 'Profile' # As only one is displayed in this view
formfield_overrides = {
PointField: {"widget": OSMWidget},
}
Run Code Online (Sandbox Code Playgroud)
我想这将是一个很好的请求功能。
作为一种解决方法,您可以利用 anInlineModelAdmin与 a 非常相似的事实ModelAdmin。两者都延伸BaseModelAdmin。
来自继承StackedInline和ModelAdmin不应该发生冲突太多。
唯一的问题是这两种__init__()方法都采用 2 个位置参数并且super().__init__()不带参数调用。所以无论继承顺序如何,它都会失败TypeError: __init__() missing 2 required positional arguments: 'parent_model' and 'admin_site'
幸运的是,InlineModelAdmin.__init__()我们感兴趣的方法并不冗长,也不复杂(super().__init__()级联调用不多)。
这是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
Run Code Online (Sandbox Code Playgroud)
这是它的父级 ( BaseModelAdmin)在 Django 1.9 中的样子
def __init__(self):
overrides = FORMFIELD_FOR_DBFIELD_DEFAULTS.copy()
overrides.update(self.formfield_overrides)
self.formfield_overrides = overrides
Run Code Online (Sandbox Code Playgroud)
现在让我们把它们放在一起:
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)
Run Code Online (Sandbox Code Playgroud)
这并不是一个真正令人满意的解决方案,因为它需要从 django 复制/粘贴一些代码,这在您使用的 Django 版本中可能会有所不同,并且在升级 Django 时可能很难维护。但是,它应该可以工作,直到它作为混合或InlineModelAdmin.
注意:上面的代码片段取自 Django 1.9,您应该浏览 github 标签以找到与您的版本对应的代码片段。
| 归档时间: |
|
| 查看次数: |
439 次 |
| 最近记录: |