2009-02-18 19 views
10

Ho bisogno di creare un formset linea chelinea formset in Django - rimozione di alcuni campi

a) esclude alcuni campi da MyModel visualizzato completamente

b) mostra alcuni alcuni campi MyModel ma ne impedisce modificabile .

Ho provato a utilizzare il codice riportato di seguito, utilizzando values() per filtrare la query impostata su solo quei valori che volevo restituiti. Tuttavia, questo non è riuscito.

Qualcuno con qualche idea?

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 

risposta

6

È un formset da utilizzare nell'amministratore? Se è così, basta impostare "exclude = ['campo1', 'campo2']" sul tuo InlineModelAdmin per escludere i campi. Per mostrare che alcuni valori dei campi non sono modificabili, dovrai creare un semplice widget personalizzato il cui metodo render() restituisce semplicemente il valore, e quindi sovrascrivere il metodo formfield_for_dbfield() per assegnare il tuo widget ai campi corretti.

Se questo non è per l'amministratore, ma un formset per l'uso altrove, è necessario effettuare le suddette personalizzazioni (attributo di esclusione nella classe Meta interna, sovrascrittura del widget nel metodo __init__) in una sottoclasse ModelForm che si passa alla costruttore di formset. (Se stai usando Django 1.2 o successivo, puoi semplicemente usare readonly_fields).

Posso aggiornare con esempi di codice se chiarisci in quale situazione ti trovi (amministratore o meno).

2

Ho appena avuto un problema simile (non per admin - per il sito user-facing) e ha scoperto che si può passare il formset e campi che si desidera visualizzare in inlineformset_factory come questo:

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

dove user_profile è un UserProfile.

Si noti che questo può causare problemi di convalida se il modello sottostante ha richiesto campi non inclusi nell'elenco dei campi passati a inlineformset_factory, ma questo è il caso per qualsiasi tipo di modulo.

12

Una cosa che non sembra essere detta nella documentazione è che è possibile includere un modulo all'interno dei parametri per i moduli di modello del modello. Così, per esempio, diciamo che avete una persona ModelForm, si può utilizzare in un modello formset facendo questo

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

Questo ti permette di fare tutto il validazione dei form, esclude, ecc a livello ModelForm e hanno la fabbrica lo replica.

Problemi correlati