2010-01-29 22 views
10

Io uso this snippet per mostrare diversi campi nel mio amministratore backend come readonly, ma come notato nei commenti, non funziona su stackedinline/tabularinline. C'è un altro modo per raggiungere questo obiettivo? Ho un elenco di oggetti collegati a un modello e voglio solo mostrarlo nella vista dettagli del modello senza la possibilità di modificare i valori.Campi di sola lettura nel django admin/inline

risposta

17

Se si esegue Django 1.3 o successivo; c'è un attributo chiamato ModelAdmin.readonly_fields che potresti usare.

InlineModelAdmin eredita da ModelAdmin, quindi dovresti essere in grado di usarlo dalla sottoclasse inline.

+0

grazie per la risposta, purtroppo, è un sistema produttivo in cui non posso utilizzare un dev-versione. – schneck

+0

FYI: questo sembra essere in produzione ora (Django 1.3 ha) –

+0

Grazie per aver notato. Ho aggiornato la risposta di conseguenza. :) – drmegahertz

2

Ho riscontrato lo stesso problema oggi. Ecco la mia soluzione. Questo è esempio di campo di sola lettura per il valore 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

Come è il caso con jQuery, sembra si può raggiungere questo modificando un attr chiamata "disabili" (opere in mia Safari, OK noi' ri ora nel 2013 :-)). esempio qui sotto:

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 
Problemi correlati