2009-02-18 19 views
10

muszę utworzyć formset inline któreInline formset w Django - usunięcie niektórych pól

a) wyklucza niektóre pola z MyModel wyświetlane są całkowicie

b) wyświetla niektóre niektóre pola MyModel ale uniemożliwia im jest edytowalne .

Próbowałem użyć poniższego kodu, używając values() w celu odfiltrowania zestawu zapytań do wartości, które chciałem odzyskać. Jednak to się nie udało.

Ktoś ma jakiś pomysł?

class PointTransactionFormset(BaseInlineFormSet): 
    def get_queryset(self): 
     qs = super(PointTransactionFormset, self).get_queryset() 
     qs = qs.filter(description="promotion feedback") 
     qs = qs.values('description','points_type') # this does not work 
     return qs 

class PointTransactionInline(admin.TabularInline): 
    model = PointTransaction 
    #formset = points_formset() 
    #formset = inlineformset_factory(UserProfile,PointTransaction) 
    formset = PointTransactionFormset 

Odpowiedz

6

Czy to jest zestaw do użycia w administracji? Jeśli tak, ustaw "exclude = ['field1', 'field2']" na twoim InlineModelAdmin, aby wykluczyć pola. Aby pokazać wartości niektórych pól, które nie mogą być edytowane, musisz utworzyć prosty niestandardowy widget, którego metoda render (just zwraca wartość, a następnie przesłonię metodę formfield_for_dbfield(), aby przypisać widget do odpowiednich pól.

Jeśli nie jest to administrator, ale zestaw do użycia w innym miejscu, należy dokonać powyższych dostosowań (wyklucz atrybut w klasie wewnętrznej Meta, nadpisanie widgetu w metodzie __init__) w podklasę ModelForm, którą należy przekazać do konstruktor formularza. (Jeśli używasz Django 1.2 lub nowszego, możesz po prostu użyć readonly_fields).

Mogę zaktualizować przykładami kodu, jeśli wyjaśnisz, w której sytuacji się znajdujesz (admin lub nie).

2

prostu miałem podobny problem (nie do administratora - na stronie użytkownika elewacyjnej) i odkrył, można zdać formset i pola, które mają być wyświetlane w inlineformset_factory tak:

factory = inlineformset_factory(UserProfile, PointTransaction, 
       formset=PointTransactionFormset, 
       fields=('description','points_type')) 
formset = factory(instance=user_profile, data=request.POST) 

gdzie user_profile jest UserProfile.

Należy pamiętać, że może to spowodować problemy z walidacją, jeśli model bazowy ma wymagane pola, które nie znajdują się na liście pól przekazanych do inlineformset_factory, ale tak jest w przypadku każdego rodzaju formularza.

12

Jedną z rzeczy, o których nie można powiedzieć w dokumentacji, jest to, że można dołączyć formularz do parametrów dla modeli formularza. Tak więc, na przykład, powiedzmy, że masz osobę ModelForm, można go używać w modelu formset wykonując tę ​​

PersonFormSet = inlineformset_factory(User, Person, form=PersonForm, extra=6) 

ta pozwala wykonać całą walidację formularza wyklucza, etc na poziomie ModelForm i mieć fabryka powiela to.

Powiązane problemy