从 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
的文件,因为在这个文件中有我创建属于 ModelA
的 ModelB
对象所需的值。
通过 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
,即使我在 Request Information
的 Files
部分看到我的文件在回溯中。
所以我的问题: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 以更优雅的方式解决我的问题的答案!
我对 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
的文件,因为在这个文件中有我创建属于 ModelA
的 ModelB
对象所需的值。
通过 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
,即使我在 Request Information
的 Files
部分看到我的文件在回溯中。
所以我的问题: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 以更优雅的方式解决我的问题的答案!