Django Admin:保存并继续编辑引发ValueError

时间:2017-07-12 22:19:51

标签: django django-admin

我必须为我们的某个模型向AWS S3存储桶提交图像,然后将其URI保存为模型的字段之一。我当前的方法涉及覆盖ModelAdmin中的默认save_model方法。我还没有提交图片,因为我正在单独测试覆盖代码。

除了创建新实例以及用户点击"保存并继续编辑"时,除了创建新实例之外,其他所有内容都只是节约。当页面再次尝试加载时,会引发一个ValueError:来自django的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)

更新: 即使在这种情况下,模型也能正确保存,只需使用新模型的数据重新加载页面即可。

1 个答案:

答案 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'])

生活很美好。