Python 如何将自定义字段添加到InlineFormSet?

Python 如何将自定义字段添加到InlineFormSet?,python,django,field,formset,inline-formset,Python,Django,Field,Formset,Inline Formset,我试图使用以下代码将自定义字段添加到InlineFormset,但这些字段不会显示在Django管理中。InlineFormset是否已锁定,无法执行此操作?我的print“ding”测试按预期启动,我可以打印出form.fields并在那里看到它们,但是实际的字段永远不会在admin中呈现 admin.py from django.contrib import admin import models from django.forms.models import BaseInlineFormS

我试图使用以下代码将自定义字段添加到InlineFormset,但这些字段不会显示在Django管理中。InlineFormset是否已锁定,无法执行此操作?我的print“ding”测试按预期启动,我可以打印出form.fields并在那里看到它们,但是实际的字段永远不会在admin中呈现

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)
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)
在管理中,只有在此进度模型中定义的字段。您没有字段/字段集选项覆盖它

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

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

    字段=('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方法来处理这个新字段。请参见:。它表示默认情况下,内联线使用BaseModelForm,它被发送到formset_工厂。它对我不起作用,试图用错误(没有属性“\u meta”)将BaseModelForm子类化。所以我改用ModelForm。

您可以通过另一种方式(动态表单)来实现:

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)
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)

不是我希望听到的,但是哦,好吧。至少已经确认了。谢谢你的回答。关于如何覆盖内联表单集的save,您还有更多的信息吗?请注意,
label=
part非常重要。如果没有它,则会出现错误
AttributeError:无法查找“我的新字段”
很好的示例,但在1.10.2中不起作用。从@alekwisnia的例子中,我发现没有
label=
new\u字段是不起作用的。如何\在示例中的何处添加
标签
?谢谢。@如果您指的是自定义字段标签,您可以尝试使用类似于extra_fields={'my_field':forms.CharField(label='my label')}的内容