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 属性无法将图像保存在磁盘上
仅当 upload_to 被称为 django 时才调整图像大小