2010-01-29 17 views
10

Używam this snippet do wyświetlania kilku pól w moim zapleczu administracyjnym jako readonly, ale jak zauważono w komentarzach, nie działa on na stackedinline/tabularinline. Czy jest jakiś inny sposób na osiągnięcie tego? Mam listę obiektów dołączonych do modelu i chcę go pokazać w widoku szczegółów modelu bez możliwości zmiany wartości.Pola tylko do odczytu w django admin/inline

Odpowiedz

17

Jeśli używasz Django 1.3 lub nowszego; istnieje atrybut o nazwie ModelAdmin.readonly_fields, którego możesz użyć.

dziedziczy po ModelAdmin, więc powinieneś być w stanie używać go z podklasy wbudowanej.

+0

dziękuję za odpowiedź, niestety, jest to system produktywny, w którym nie mogę używać wersji dev. – schneck

+0

FYI: wydaje się, że teraz jest w produkcji (Django 1.3 ma) –

+0

Dzięki za uwagę. Odpowiednio zaktualizowałem odpowiedź. :) – drmegahertz

2

Znam ten sam problem już dziś. Oto moje rozwiązanie. To jest przykład tylko do odczytu pola dla wartości ForeignKey:

class MySelect(forms.Select): 
    def render(self, name, value, attrs=None, choices=()): 
     s = Site.objects.get(id=value) 
     return s.name 

class UserProfileInlineForm(forms.ModelForm): 
    site = forms.ModelChoiceField(queryset=Site.objects.all(), widget=MySelect) 

class UserProfileInline(admin.StackedInline): 
    model = UserProfile 
    form = UserProfileInlineForm 
0

jak w przypadku z JQuery, wydaje się, można to osiągnąć poprzez zmianę o attr nazwie „Disabled” (prace w moim Safari, OK my” teraz w 2013 :-)). Przykład poniżej:

def get_form(self, request, obj=None, **kwargs): 
     result = super(<your ModelAdmin class here>, self).get_form(request, obj=obj, **kwargs) 
     result.base_fields[<the select field you want to disable>].widget.attrs['disabled'] = 'disabled' 
     return result