2009-02-09 18 views
6

Ich versuche, einem InlineFormset mit dem folgenden Code benutzerdefinierte Felder hinzuzufügen, aber die Felder werden nicht im Django Admin angezeigt. Ist das InlineFormset zu gesperrt, um dies zu ermöglichen? Mein print "ding" -Test wird wie erwartet ausgelöst, ich kann die form.fields ausdrucken und sie alle dort sehen, aber die tatsächlichen Felder werden nie im Admin gerendert.Wie füge ich benutzerdefinierte Felder zu InlineFormsets hinzu?

admin.py

from django.contrib import admin 
import models 
from django.forms.models import BaseInlineFormSet 
from django import forms 
from forms import ProgressForm 
from django.template.defaultfilters import slugify 

class ProgressInlineFormset(BaseInlineFormSet): 
    def add_fields(self, form, index): 
     print "ding" 
     super(ProgressInlineFormset, self).add_fields(form, index) 
     for criterion in models.Criterion.objects.all(): 
      form.fields[slugify(criterion.name)] = forms.IntegerField(label=criterion.name) 

class ProgressInline(admin.TabularInline): 
    model = models.Progress 
    extra = 8 
    formset = ProgressInlineFormset 

class ReportAdmin(admin.ModelAdmin): 
    list_display = ("name", "pdf_column",) 
    search_fields = ["name",] 
    inlines = (ProgressInline,) 

admin.site.register(models.Report, ReportAdmin) 

Antwort

1
model = models.Progress 

Im Admin wird es nur die Felder in diesem Fortschritt Modell definiert werden. Sie haben keine Feld-/Feldgruppen-Option, die es überschreibt.

Wenn Sie die neue hinzufügen wollen, gibt es zwei Möglichkeiten:

  • In der Modelldefinition, fügen diese neuen zusätzlichen Felder (! Machen sie optional)
  • Im Admin-Modell (admin.TabularInline), fügen Sie etwas so etwas wie:

    Felder = ('newfield1', 'newfield2', 'newfield3')

Werfen Sie einen Blick auf , fieldsets.

+0

Nicht das, was ich höre, hatte gehofft, aber na ja. Zumindest ist es bestätigt. – Soviut

4

Ich habe es einen anderen Weg:

forms.py:

from django import forms 
class ItemAddForm(forms.ModelForm): 
    my_new_field = forms.IntegerField(initial=1, label='quantity') 
    class Meta: 
     model = Item 

admin.py:

from django.contrib import admin 
from forms import * 
class ItemAddInline(admin.TabularInline): 
    form = ItemAddForm 

Das bisher funktioniert, muss ich nur irgendwie die Methode speichern außer Kraft setzen um dieses neue Feld zu bearbeiten. Siehe dies: http://docs.djangoproject.com/en/dev/ref/contrib/admin/#form. Es besagt, dass Inlines standardmäßig BaseModelForm verwenden, das an formset_factory gesendet wird. Es funktioniert nicht für mich, versuchte, BaseModelForm mit Fehlern (kein Attribut '_meta') zu untergliedern. Also verwende ich stattdessen ModelForm.

+0

Vielen Dank für diese Antwort. Haben Sie weitere Informationen darüber, was Sie zum Speichern von Inline-Formsets außer Kraft gesetzt haben? –

+0

Nein, habe seit Jahren nicht mehr daran gearbeitet ... – alekwisnia

+2

Ich möchte erwähnen, dass 'label =' part sehr wichtig ist. Ohne dies gibt es einen Fehler 'AttributeError: Kann 'my_new_field'' nicht finden – TitanFighter

2

Sie können sie durch eine andere Art und Weise (Dynamische Formulare) tun:

admin.py

class ProgressInline(admin.TabularInline): 
    model = models.Progress 
    extra = 8 

    def get_formset(self, request, obj=None, **kwargs): 
     extra_fields = {'my_field': forms.CharField()} 
     kwargs['form'] = type('ProgressForm', (forms.ModelForm,), extra_fields) 
     return super(ProgressInline, self).get_formset(request, obj, **kwargs) 
+0

Gutes Beispiel, funktioniert aber nicht in 1.10.2. Im @ alekwisnia Beispiel habe ich festgestellt, dass ohne 'label = 'new_field nicht funktioniert. Wie \ wo fügen Sie das "Label" in Ihrem Beispiel hinzu? Vielen Dank. – TitanFighter

Verwandte Themen