从 ModelAdmin 内联的 ModelForm 访问文件

Access file from ModelForm of an Inline within ModelAdmin

我对 django 比较陌生,所以我尝试做的事情可能明显是错误的,但请多多包涵。 :-)

我有一个 ModelForm 和一个 FileField:

class ModelBForm(ModelForm):
file = forms.FileField()

class Meta:
    model = ModelB
    fields = ['some_additional_field']

我将其包含在 Inline:

class ModelBInline(admin.StackedInline):
    form = MyForm
    model = ModelB

我在ModelAdmin中设置:

class ModelAAdmin(admin.ModelAdmin):
    inlines = [ModelBInline]

我在 admin.py 中包含的内容:

admin.site.register(ModelA, ModelAAdmin)

现在我需要访问 FormB 的文件,因为在这个文件中有我创建属于 ModelAModelB 对象所需的值。

通过 Inline 添加单个 ModelB 对象太麻烦了,这就是我想要导入文件的原因。

我知道,如果 FormB 直接包含在 ModelAAdmin 中,我可以覆盖 save_model 来访问文件:

class ModelAAdmin(admin.ModelAdmin):
    form = ModelBForm

    def save_model(self, request, obj, form, change):
        file = request.FILES['file']
        # do stuff with file

但是由于文件中的值是 ModelB 值而不是 ModelA 值我想在 Inline 而不是 ModelAdmin 中输入文件.

尝试覆盖 save_relatedsave_formset 总是给我一个 MultiValueDictKeyError,即使我在 Request InformationFiles 部分看到我的文件在回溯中。

所以我的问题:Where/How我可以访问包含在内联中的表单文件,在 ModelAdmin 中使用吗?

提前致谢。

似乎 save_related 是这样做的地方。

尽管如此,您不应该通过请求访问该文件。如果它在表单中,您应该通过 form.cleaned_data['file'].

访问它

我现在找到了解决方案,但感觉有点像 hack。 "hacky" 部分是我必须在 save_model 方法中保存 ModelA 的 ID,以便我可以从 save_formset 访问它。

class ModelAAdmin(admin.ModelAdmin):
    modela_id = 0
    inlines = [ModelBInline]

    def save_formset(self, request, form, formset, change):
        instances = formset.save(commit=False)
        additional = instances[0].some_additional_field
        modela = ModelA.object.get(id=self.modela_id)
        file = formset[0].cleaned_data['file']
        # use file, additional and modela to create modelb objects

    def save_model(self, request, obj, form, change):
        obj.save()
        self.modela_id = obj.id

欢迎 post 以更优雅的方式解决我的问题的答案!