我必须为我们的某个模型向AWS S3存储桶提交图像,然后将其URI保存为模型的字段之一。我当前的方法涉及覆盖ModelAdmin中的默认save_model
方法。我还没有提交图片,因为我正在单独测试覆盖代码。
invalid literal for int() with base 10: 'None'
,试图加载url`` / lift / organization / None /`而不是主键。
我认为它与返回值有关,但是在检查源代码时它看起来并非如此(我也试过返回对象和对象' s id
)。我最后一次尝试解决的是使用重定向,这似乎没有任何效果。
主要问题是我想使用组织的主键作为Model实例与S3存储桶中的图像之间的关联,因此这只是用户创建新组织时的一个问题。 / p>
这是代码。我假设问题是我在这个例子中没有通过super方法保存模型,但我不确定是什么。
obj = obj if change else lift.models.Organization(**form.cleaned_data)
if not change:
obj.save()
return redirect('/lift/organization/{}/'.format(obj.id))
super(OrganizationAdmin, self).save_model(request, obj, form, change)
更新: 即使在这种情况下,模型也能正确保存,只需使用新模型的数据重新加载页面即可。
答案 0 :(得分:1)
save_model
方法没有返回值,因此从重写方法返回任何内容都不会产生任何影响。
我从错误的角度接近这个问题,主要是因为不知道save_model
方法变异为obj
变量。在理解这一点后,我能够提出以下解决方案:
在重写的save_model
方法中:
f = request.FILES.get('image', None)
if f:
# Add the UploadedFile object as an attribute to the obj.
obj.image_to_upload_to_s3 = f
super(OrganizationAdmin, self).save_model(request, obj, form, change)
这解决了Django无法正确获取页面加载URL的问题。请注意,我不再在save_model
中明确调用obj.save()。
然后,在post_save
信号中,我添加了以下内容:
if 'instance' in kwargs:
organization = kwargs['instance']
if hasattr(organization, 'image_to_upload_to_s3'):
put_to_s3_function(organization)
url = derive_s3_url(organization)
# Make sure to delete the attribute, or you'll recurse forever.
delattr(organization, 'image_to_upload_to_s3')
organization.image_url = url
organization.save(update_fields=['image_url'])
生活很美好。