2009-02-18 14 views
10

Ich brauche eine Inline-formset zu schaffen, dieInline formset in Django - Entfernen bestimmter Felder

a) einige Felder aus MyModel ausgeschlossen werden insgesamt angezeigt

b) zeigt einige einige Felder MyModel aber verhindert, dass sie zu sein editierbar .

Ich versuchte, den folgenden Code zu verwenden, values() zu verwenden, um das Abfrage-Set auf genau die Werte zu filtern, die ich zurückgeben wollte. Dies ist jedoch fehlgeschlagen.

Jemand mit einer Idee?

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 

Antwort

6

Ist dies ein Formularsatz für den Einsatz im Admin? Ist dies der Fall, setzen Sie einfach "exclude = ['field1', 'field2']" auf Ihrem InlineModelAdmin, um Felder auszuschließen. Um einige Felder als nicht editierbar darzustellen, müssen Sie ein einfaches benutzerdefiniertes Widget erstellen, dessen Methode render() nur den Wert zurückgibt und dann die Methode formfield_for_dbfield() überschreibt, um Ihr Widget den richtigen Feldern zuzuordnen.

Wenn dies nicht für den admin ist, sondern ein Formset für die Verwendung an anderer Stelle, sollten Sie die obigen Anpassungen (Attribut in der inneren Meta-Klasse, Widget überschreiben in der __init__-Methode) in einer ModelForm-Unterklasse vornehmen Formularsatzkonstruktor (Wenn Sie Django 1.2 oder höher verwenden, können Sie stattdessen readonly_fields verwenden).

Ich kann mit Codebeispielen aktualisieren, wenn Sie klarstellen, in welcher Situation Sie sich befinden (admin oder nicht).

2

Ich hatte gerade ein ähnliches Problem (nicht für den Admin - für den Standort Benutzer gerichtete) und entdeckt man die formset passieren können und Felder, die Sie in inlineformset_factory wie diese angezeigt werden sollen:

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

wo user_profile ein UserProfile.

Seien Sie gewarnt, dass dies zu Validierungsproblemen führen kann, wenn das zugrunde liegende Modell Felder erfordert, die nicht in der Feldliste enthalten sind, die an inlineformset_factory übergeben wurde, aber das ist für jede Art von Formular der Fall.

12

Eine Sache, die in der Dokumentation nicht erwähnt zu werden scheint, ist, dass Sie ein Formular in Ihre Parameter für Modellformsätze einfügen können. So zum Beispiel, sagen wir, Sie eine Person Modelform haben, können Sie es in einem Modell, indem Sie diese

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

Formset verwenden Auf diese Weise können Sie alle Formular-Validierung zu tun, schließt, usw. auf einer Modelform-Ebene und haben die Fabrik repliziert es.

Verwandte Themen