Django使用upload_to实例保存图像保持实例属性无

Posted

技术标签:

【中文标题】Django使用upload_to实例保存图像保持实例属性无【英文标题】:Django save image using upload_to instance keeps instance properties None 【发布时间】:2012-03-15 12:07:40 【问题描述】:

我正在尝试使用以下代码(在 models.py 中)为上传的图片提供更好的路径:

def get_image_path_photos(instance, filename):
return os.path.join('photos', str(instance.someproperty), filename)

和模型

class Photo(models.Model):
someproperty = models.CharField(max_length=17, blank=False, null=False, default="something")
photo = models.ImageField(upload_to=get_image_path_photos, blank=True, null=True)

当我在新插入后保存它时,它将它保存在路径 /photos/something/ 中(它继续使用默认值)。 当我编辑它,添加照片并保存时,它会将其保存到正确的路径。 所以它必须在保存新对象的同时做一些事情,它还不存在。

我对 instance.id 进行了同样的尝试,这也一直是 None (我在 id 上使用自动增量读取解决了这个问题,但这听起来也使用默认值,并且使用默认 pk/id 是 auto增量)。

我发现了一些类似的问题,但没有一个可以解决我的问题。

我想使用 pre_save 信号....但不知何故,我的直觉告诉我这不是正确的方法。

我自己发现的问题的解决方法,请看我的回答...很好的一课,不要使用与字段名相同的slugname定义.....

【问题讨论】:

我刚试过你的代码,它把照片保存到“photos/something/avatar_big.png”。您的问题不在您发布的代码中。 问题是,当您使用默认值以外的其他值时,例如 someproperty=somethingeElse,它会一直将其保存到某个东西而不是 somethingElse 我只是尝试将值更改为'bar',它保存图像到:'photos/bar/avatar_big.png' 是的,谢谢你的努力,我刚刚发现了一些别的东西,它与 slugname 与文件名相同有关。无论如何,我投票给你,为你的努力!谢谢。 【参考方案1】:

对此感到抱歉。问题有点复杂。我也在 url 中使用字段 someproperty 作为帖子中的 slug.... 我刚刚发现了一些我没想到的东西。

我使用 url 中的默认值从 url 发布了我的帖子(使用 django rest 框架)......但我用其他东西填写了该字段。

比,因为我将 slugname 定义为与字段名相同,它会用来自 url 的值覆盖您在字段中填写的任何内容...。 这不完全是我的本意,但很有道理。

大概的解决办法就是调用slug名和字段名不一样......

无论如何我都会保留这个问题和答案,因为对我来说这是一个难题......(可能对某人有帮助)

作为 jpic 答案的补充: 我在 django rest framwwork 中使用了 url,可以说; http:\someurl\api\照片\\ 并在那里张贴照片。

使用 someproperty=bar 发布照片 avatar_big.png:

使用网址 http\someurl\api\photos\something 时将照片保存在 photos\something\ 中

并在使用 url http:\someurl\api\photos\bar 时将照片保存在 photos\bar\ 中

问题是(我猜,还是要检查一下)我用于 url 的 slug 名称与字段名称相同。

这是我在 views.py 中使用的代码(我在 django-rest-framework 中使用的基于类的视图):

class PhotoBySomePropertyListOrCreateModelView(ListOrCreateModelView):
permissions = (IsAuthenticated, )
form = PhotoForm
def get_queryset(self):
    someproperty=self.kwargs['someproperty']
    return Photo.objects.filter(someproperty=someproperty)

在 urls.py 中:

url(r'^api/photos/(?P<someproperty>[\w:]+)/$', PhotoBySomePropertyListOrCreateModelView.as_view(resource=PhotoResource)),

这里你看到了问题,它不听'someproperty'中的字段,而是听url中的值......

改变它 url(r'^api/photos/(?P[\w:]+)/$', PhotoBySomePropertyListOrCreateModelView.as_view(resource=PhotoResource)),

应该做的伎俩....当然也调整视图

【讨论】:

以上是关于Django使用upload_to实例保存图像保持实例属性无的主要内容,如果未能解决你的问题,请参考以下文章

imageField 中的 upload_to 属性无法将图像保存在磁盘上

如何在保存实例之前获取 django 模型实例的 pk

仅当 upload_to 被称为 django 时才调整图像大小

Django - 如何获取与另一个字段相关的upload_to目录

使用 Heroku 处理 Django 媒体文件

django 内置upload_to