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 - 如何在自定义管理表单中为多对多字段添加绿色加号的主要内容,如果未能解决你的问题,请参考以下文章
如何在自定义 django 表单中隐藏 django 标签?