Администратор Django - Как я могу добавить зеленый знак плюс для поля «Многие ко многим» в пользовательской форме администратора - PullRequest
5 голосов
/ 12 сентября 2010

Зеленая кнопка со знаком плюс для добавления новых экземпляров в форме администратора исчезает для моего поля MultiSelect (фотографии), когда я определяю его в своей форме. То есть удаление строки с определением (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, но я не совсем понял, как его найти. Любая помощь приветствуется!

Ответы [ 2 ]

10 голосов
/ 12 сентября 2010

С помощью lazerscience и этой записи я получил следующее:

The 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) 
8 голосов
/ 12 сентября 2010

Да, вы правы, вы должны обернуть свой виджет в django.contrib.admin.widgets.RelatedFieldWidgetWrapper, что оказывается немного сложным, так как он ожидает, что текущий сайт администратора является параметром для инициализации!Может быть, вы найдете этот пост полезным!

...