2009-02-09 89 views
6

我想使用以下代碼將自定義字段添加到InlineFormset,但這些字段不會顯示在Django Admin中。 InlineFormset是否被鎖定以允許這個?我的打印「叮」測試按預期發射,我可以打印出form.fields並在那裏看到它們,但實際的字段永遠不會顯示在管理中。如何將自定義字段添加到InlineFormsets?

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) 

回答

1
model = models.Progress 

在管理將只有在這個進展模型中定義的字段。您沒有字段/字段集選項覆蓋它。

如果要添加新的,有兩種選擇:

  • 在模型定義,添加這些新的附加字段(!讓他們可選)
  • 在管理模式(admin.TabularInline),添加的東西類似:

    字段=( 'newfield1', 'newfield2', 'newfield3')

看看fieldsfieldsets

+0

不是我所希望聽到的,但哦。至少它證實了。 – Soviut 2009-02-09 19:59:49

4

我做到了另一種方式:

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 

到目前爲止是這種情況,我只需要以某種方式重寫保存方法來處理這個新領域。看到這個:http://docs.djangoproject.com/en/dev/ref/contrib/admin/#form。它說默認情況下Inlines使用BaseModelForm,它發送到formset_factory。它不適用於我,試圖將SubModelForm的子類與錯誤(沒有屬性'_meta')。所以我使用ModelForm來代替。

+0

謝謝你的回答。你是否有更多關於你爲重寫Inline Formset保存的信息? – 2014-02-26 23:15:39

+0

不,沒有多年的工作...... – alekwisnia 2014-02-28 13:08:50

2

您可以通過另一種方式做到這一點(動態形式):

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) 
相關問題