Как добавить пользовательские поля в InlineFormsets?

Я пытаюсь добавить пользовательские поля в InlineFormset, используя следующий код, но поля не будут отображаться в Администраторе Django. Это InlineFormset слишком закрыта, чтобы разрешить это? Мой тест печати" Динь " срабатывает, как и ожидалось, я могу распечатать форму.поля и увидеть их все там, но фактические поля никогда не отображаются в Администраторе.

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)

3 ответов


model = models.Progress

в admin будут только поля, определенные в этом прогресса - модели. У вас нет опции fields/fieldsets перезаписи.

Если вы хотите, чтобы добавить новые, есть два варианта:

  • в определении модели добавьте эти новые дополнительные поля (сделайте их необязательными!)
  • в модели администрирования (админ.TabularInline), добавить что-то вроде:

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

посмотри поля, fieldsets.


Я сделал иначе:

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

это работает до сих пор, мне нужно только переопределить каким-то образом метод save для обработки этого нового поля. Смотри:http://docs.djangoproject.com/en/dev/ref/contrib/admin/#form . В нем говорится, что по умолчанию Inlines использует BaseModelForm, который отправляется в formset_factory. Он не работает для меня, пытался подкласс BaseModelForm с ошибками (без атрибута '_meta'). Поэтому я использую Вместо этого ModelForm.


вы можете сделать это другим способом (динамические формы):

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)