如何向InlineFormsets添加自定义字段?

Sov*_*iut 6 python django field formset inline-formset

我正在尝试使用以下代码将自定义字段添加到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)
Run Code Online (Sandbox Code Playgroud)

ale*_*nia 5

我用另一种方式做到了:

表格.py:

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

管理.py:

from django.contrib import admin
from forms import *
class ItemAddInline(admin.TabularInline):
    form = ItemAddForm
Run Code Online (Sandbox Code Playgroud)

到目前为止,这是有效的,我只需要以某种方式覆盖 save 方法来处理这个新字段。请参阅:http : //docs.djangoproject.com/en/dev/ref/contrib/admin/#form。它说默认情况下内联使用 BaseModelForm,它被发送到 formset_factory。它对我不起作用,试图将 BaseModelForm 子类化为错误(无属性“_meta”)。所以我使用 ModelForm 代替。

  • 想提一下,`label=` 部分非常重要。没有它,就会出现错误`AttributeError: Unable to lookup 'my_new_field'` (3认同)

Dav*_*cos 0

model = models.Progress
Run Code Online (Sandbox Code Playgroud)

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

如果您想添加新的,有两种选择:

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

    字段=('新字段1','新字段2','新字段3')

看看字段字段集