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