Как добавить пользовательские поля в 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')
Я сделал иначе:
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)