我对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
对象所需的值,这些对象属于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_related
和save_formset
总是给我一个MultiValueDictKeyError
,即使我在Traceback中Request Information
的Files
部分看到我的文件。
所以我的问题:我在哪里/如何访问包含在内联的表单文件,在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
请随意张贴答案,以更优雅的方式解决我的问题!