Django admin - 如何在自定义管理表单中为多对多字段添加绿色加号

Posted

技术标签:

【中文标题】Django admin - 如何在自定义管理表单中为多对多字段添加绿色加号【英文标题】:Django admin - How can I add the green plus sign for Many-to-many Field in custom admin form 【发布时间】:2011-04-11 04:56:40 【问题描述】:

当我在表单中定义多选字段(照片)时,用于在管理表单中添加新实例的绿色加号按钮消失了。即,删除带有定义的行 (photos = ...) 会使加号出现。但是,为了使用自定义字段/小部件,我需要弄清楚这一点。

class GalleryForm(ModelForm):

    photos = ModelMultipleChoiceField(queryset=Photo.objects.all(), label="Photos")

    def __init__(self, *args, **kwargs):
        super(GalleryForm, self).__init__(*args, **kwargs)

我查看了 Django 源代码,似乎我必须将我的小部件包装在 RelatedFieldWidgetWrapper 中,但我还没有完全理解它。感谢任何帮助!

【问题讨论】:

【参考方案1】:

是的,你是对的,你必须用django.contrib.admin.widgets.RelatedFieldWidgetWrapper 包装你的小部件,这有点复杂,因为它需要当前管理站点作为初始化参数!也许你会发现这个post 有帮助!

【讨论】:

【参考方案2】:

在 lazerscience 和 post 的帮助下,我得到了以下结果。

模型管理员:

class GalleryAdmin(admin.ModelAdmin):

    form = GalleryForm

    def __init__(self, model, admin_site):
        self.form.admin_site = admin_site 
        super(GalleryAdmin, self).__init__(model, admin_site)

还有我的表格:

class GalleryForm(ModelForm):

    photos = ThumbnailChoiceField(queryset=Photo.objects.all(), label='Photos', widget=MyWidget(), required=False)

    def __init__(self, *args, **kwargs):
        super(GalleryForm, self).__init__(*args, **kwargs)
        rel = ManyToOneRel(self.instance.photos.model, 'id') 
        self.fields['photos'].widget = RelatedFieldWidgetWrapper(self.fields['photos'].widget, rel, self.admin_site) 

【讨论】:

在 Django 1.2 中会引发一个异常,指出表单没有 admin_site 属性。我做错了吗? @orokusaki 有点太晚了(比如 7 年后),但你可以试试:from django.contrib.admin import site as admin_site 如所见 here 感谢 Reimund 的回复,我一直在努力想出这个问题,您的回答对我很有帮助。但现在我的问题是弹出窗口正在替换当前 URL,并且无法在弹出窗口中打开。我该怎么办?

以上是关于Django admin - 如何在自定义管理表单中为多对多字段添加绿色加号的主要内容,如果未能解决你的问题,请参考以下文章

根据值在 Admin 中自定义 Django 表单字段

如何在自定义 django 表单中隐藏 django 标签?

在自定义管理页面中显示正确的 django 身份验证框架信息

Django-Admin:集成自定义表单

如何在自定义模板中使用 Django 的管理员布尔图标?

如何将额外的参数传递给 django admin 自定义表单?