从ModelAdmin中的Inline的ModelForm访问文件

时间:2015-09-17 10:36:26

标签: django django-models django-forms django-admin

我对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的文件,因为在此文件中是我创建属于ModelB的{​​{1}}对象所需的值。

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

我知道如果Inline中直接包含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中输入文件

尝试覆盖ModelAdminsave_related总是给我一个save_formset,即使我在MultiValueDictKeyError的{​​{1}}部分看到了我的文件回溯。

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

提前致谢。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

我现在找到了一个解决方案,但感觉有点像黑客。 &#34; hacky&#34; 部分是我必须在save_formset方法中保存ModelA的ID,以便我可以从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 访问它。< / p>

{{1}}

随意发布以更优雅的方式解决问题的答案!