Django-在管理界面的内联表单中添加一个额外字段
假设我在Django-在管理界面的内联表单中添加一个额外字段,django,django-admin,django-forms,Django,Django Admin,Django Forms,假设我在admin.py中有以下内容: class ImageInline(admin.TabularInline): model = Image class ObjectAdmin(admin.ModelAdmin): inlines = [ ImageInline, ] 如何向ImageInline中添加一个不属于Imagemodel中的字段的额外字段?与使用普通ModelAdmin的方法相同。InlineModelAdmin可以接受表单属性。因此,创建一个自定义表单,在
admin.py
中有以下内容:
class ImageInline(admin.TabularInline):
model = Image
class ObjectAdmin(admin.ModelAdmin):
inlines = [ ImageInline, ]
如何向
ImageInline
中添加一个不属于Image
model中的字段的额外字段?与使用普通ModelAdmin的方法相同。InlineModelAdmin可以接受表单属性。因此,创建一个自定义表单,在内联中添加所需的额外字段:
class ImageInline(admin.TabularInline):
model = Image
form = MyCustomForm
8年后,被接受的答案将不起作用 例如,在
Django-2.2.3
中的以下设置中呈现MyInlineForm
中的自定义表单字段:
class MyInlineAdmin(admin.StackedInline):
model = MyInlineModel
form = MyInlineForm
@admin.register(MyModelAdmin)
class MyModelAdmin(admn.ModelAdmin):
inlines = (MyInlineAdmin,)
受此启发,这可以通过重写ModelFormMetaclass来实现
解决方案1:
from django.forms.models import ModelFormMetaclass
class MyModelFormMetaclass(ModelFormMetaclass):
def __new__(cls, name, bases, attrs):
for field in ['test_1', 'test_2', 'test_3']:
attrs[field] = forms.CharField(max_length=30)
return super().__new__(cls, name, bases, attrs)
class MyInlinelForm(forms.ModelForm, metaclass=MyModelFormMetaclass):
class Meta:
model = MyInlineModel
fields = '__all__'
class MyInlineForm(forms.ModelForm):
class Meta:
model = MyInlineModel
fields = '__all__'
class MyInlineAdmin(admin.StackedInline):
model = MyInlineModel
form = MyInlineForm
@admin.register(MyModelAdmin)
class MyModelAdmin(admn.ModelAdmin):
inlines = (MyInlineAdmin,)
def get_formsets_with_inlines(self, request, obj=None):
for inline in self.get_inline_instances(request, obj):
if isinstance(inline, MyInlineAdmn):
for field in ['test_1', 'test_2', 'test_3']:
inline.form.declared_fields[field] = forms.CharField(max_length=30)
yield inline.get_formset(request, obj), inline
查看相关代码,从中继承attrs
传递到表单的声明的\u字段
:
for key, value in list(attrs.items()):
if isinstance(value, Field):
current_fields.append((key, value))
attrs.pop(key)
attrs['declared_fields'] = OrderedDict(current_fields)
基于此观察,并遵循
我尝试使用ModelAdmin
的方法来丰富声明的_字段
,它也起到了作用:
解决方案2:
from django.forms.models import ModelFormMetaclass
class MyModelFormMetaclass(ModelFormMetaclass):
def __new__(cls, name, bases, attrs):
for field in ['test_1', 'test_2', 'test_3']:
attrs[field] = forms.CharField(max_length=30)
return super().__new__(cls, name, bases, attrs)
class MyInlinelForm(forms.ModelForm, metaclass=MyModelFormMetaclass):
class Meta:
model = MyInlineModel
fields = '__all__'
class MyInlineForm(forms.ModelForm):
class Meta:
model = MyInlineModel
fields = '__all__'
class MyInlineAdmin(admin.StackedInline):
model = MyInlineModel
form = MyInlineForm
@admin.register(MyModelAdmin)
class MyModelAdmin(admn.ModelAdmin):
inlines = (MyInlineAdmin,)
def get_formsets_with_inlines(self, request, obj=None):
for inline in self.get_inline_instances(request, obj):
if isinstance(inline, MyInlineAdmn):
for field in ['test_1', 'test_2', 'test_3']:
inline.form.declared_fields[field] = forms.CharField(max_length=30)
yield inline.get_formset(request, obj), inline
用于在管理面板上为应用程序模型的枚举字段(如反应)添加下拉菜单功能,用于扩展StackedLine或TablerLine类;这会奏效的。另一种情况的解决方案,类扩展ModelAdmin也在comment中给出了MyCustomForm
是否可以在不添加form
属性的情况下显示初始字段?如中所示,我将只是附加到它,而不是重写字段。某种性质的super
。好的,我用ModelForm
和class Meta:model=Image