Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django-在管理界面的内联表单中添加一个额外字段_Django_Django Admin_Django Forms - Fatal编程技术网

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