6

我正在尝试使用以下代码将自定义字段添加到 InlineFormset,但这些字段不会显示在 Django Admin 中。InlineFormset 是否过于锁定而不允许这样做?我的 print "ding" 测试按预期触发,我可以打印出 form.fields 并在那里查看它们,但实际字段永远不会在管理员中呈现。

管理员.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)
4

3 回答 3

5

我用另一种方式做到了:

表格.py:

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

管理员.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。它对我不起作用,尝试将 BaseModelForm 子类化并出现错误(没有属性'_meta')。所以我改用 ModelForm 。

于 2010-02-12T10:06:37.487 回答
2

您可以通过另一种方式来做到这一点(动态形式):

管理员.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)
于 2014-11-14T08:27:09.530 回答
1
model = models.Progress

在管理员中,只有在此Progress模型中定义的字段。您没有覆盖它的字段/字段集选项。

如果要添加新的,有两个选项:

  • 在模型定义中,添加那些新的附加字段(使它们成为可选的!)
  • 在管理模型(admin.TabularInline)中,添加如下内容:

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

看看领域,领域

于 2009-02-09T12:12:45.163 回答