从ModelAdmin内的Inline的ModelForm访问文件



我对django比较陌生,所以我想做的可能是明显错误的,但请原谅我。: -)

我有一个ModelFormFileField:

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的文件,因为在这个文件中有我创建ModelB对象所需的值,这些对象属于ModelA

通过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,即使我在Traceback中Request InformationFiles部分看到我的文件。

所以我的问题:我在哪里/如何访问包含在内联的表单文件,在ModelAdmin中使用?

似乎save_related将是这样做的地方。

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

我现在找到了一个解决方案,但感觉有点像黑客。"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

请随意张贴答案,以更优雅的方式解决我的问题!

最新更新