代码之家  ›  专栏  ›  技术社区  ›  Reimund

django admin-如何在自定义管理窗体中为“多对多”字段添加绿色加号?

  •  5
  • Reimund  · 技术社区  · 15 年前

    当我在窗体中定义多选择字段(照片)时,用于在管理窗体中添加新实例的绿色加号按钮将消失。也就是说,删除带有定义的行(照片=…)将显示加号。但是,为了使用自定义字段/小部件,我需要弄清楚这一点。

    class GalleryForm(ModelForm):
    
        photos = ModelMultipleChoiceField(queryset=Photo.objects.all(), label="Photos")
    
        def __init__(self, *args, **kwargs):
            super(GalleryForm, self).__init__(*args, **kwargs)
    

    我已经看过django源代码,看起来我必须用一个相关的fieldwidgetwrapper包装我的小部件,但是我还没有完全理解它。任何帮助都是很好的!

    2 回复  |  直到 15 年前
        1
  •  10
  •   Reimund    15 年前

    在Lazerscience的帮助下 post 我以以下几点结束。

    ModelAdmin:

    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) 
    
        2
  •  8
  •   Bernhard Vallant    15 年前

    是的,你是对的,你必须用 django.contrib.admin.widgets.RelatedFieldWidgetWrapper 结果有点复杂,因为它期望当前的管理站点作为初始化的参数!也许你会找到这个 post 乐于助人!

    推荐文章