Как добавить пользовательские поля в InlineFormsets? - PullRequest
6 голосов
/ 09 февраля 2009

Я пытаюсь добавить пользовательские поля в InlineFormset, используя следующий код, но эти поля не отображаются в Django Admin. InlineFormset слишком заблокирован, чтобы позволить это? Мой тест «ding» запускается, как и ожидалось, я могу распечатать form.fields и увидеть их все там, но фактические поля никогда не отображаются в администраторе.

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 ]

4 голосов
/ 12 февраля 2010

Я сделал это по-другому:

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.

2 голосов
/ 14 ноября 2014

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

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)
1 голос
/ 09 февраля 2009
model = models.Progress

В админке будут только поля, определенные в этой Progress модели. У вас нет опции поля / набора полей, перезаписывающей его.

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

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

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

Взгляните на полей , полей .

...