我对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
中输入文件
尝试覆盖ModelAdmin
和save_related
总是给我一个save_formset
,即使我在MultiValueDictKeyError
的{{1}}部分看到了我的文件回溯。
所以我的问题:在哪里/如何访问包含在内联中的表单文件,在ModelAdmin中使用?
提前致谢。
答案 0 :(得分:0)
似乎save_related
就是这样做的地方。
但您不应该通过请求访问该文件。如果它在表单中,您应该通过form.cleaned_data['file']
访问它。
答案 1 :(得分:0)
我现在找到了一个解决方案,但感觉有点像黑客。
" hacky" 部分是我必须在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}}
随意发布以更优雅的方式解决问题的答案!