2010-09-11 9 views
5

Zielony przycisk plusa dodawania nowych wystąpień w formularzu administratora znika w polu Moje zdjęcie (zdjęcia), gdy je zdefiniuję w mojej formie. Tj. Usunięcie linii z definicją (zdjęcia = ...) powoduje pojawienie się znaku plus. Jednak aby użyć niestandardowego pola/widżetu, muszę to zrozumieć.Administrator Django - Jak dodać zielony znak plusa dla pola Wiele do wielu w niestandardowym formularzu administratora

class GalleryForm(ModelForm): 

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

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

Mam zajrzał w kodzie źródłowym Django i wydaje się, że muszę zawinąć mój widżet w RelatedFieldWidgetWrapper, ale nie całkiem zdobyć głowę wokół niego. Każda pomoc jest doceniana!

Odpowiedz

10

Przy pomocy lazerscience i tego post skończyło się na:

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) 

A moja forma:

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) 
+0

W Django 1.2 wyjątek jest podniesiona mówiąc, że forma nie posiada 'admin_site 'atrybut. czy robię coś źle? – orokusaki

+0

@orokusaki Trochę za późno (jak 7 lat później), ale możesz spróbować: 'od django.contrib.admin importuj stronę jako admin_site' jak widać [tutaj] (https://github.com/django/django/blob/ 9dc83c356d363c090f3351c908cad6f823aeb7bf/tests/admin_inlines/tests.py # L9) – raratiru

8

Tak, masz rację, musisz zawinąć widżet przy pomocy django.contrib.admin.widgets.RelatedFieldWidgetWrapper, co okazuje się nieco skomplikowane, ponieważ oczekuje, że aktualna strona administratora będzie parametrem inicjującym! Może znajdziesz ten post pomocny!

+0

Dzięki, że pracował :-) – Reimund

Powiązane problemy