我正在尝试使用此代码(在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信号....但不知怎的,我的胆量说这不是正确的方法。
我的问题的解决方案我发现了myselve,请看我的答案......一个好的教训,不要使用与字段名称相同的slugname定义.....
答案 0 :(得分:0)
对此感到抱歉。问题有点复杂。我在url中使用字段someproperty作为帖子的slug .... 我刚刚发现了一些我没想到的东西。
我使用网址中的默认值从网址发布了我的帖子(使用django rest框架)...但是我用其他内容填充了该字段。
,因为我将slugname定义为与fieldname相同,它会覆盖你在字段中填写的任何内容,其中包含来自url的值.... 这不是我想要做的事情,但是很有意义。
可能解决方法是调用slug名称与字段名称不相同......
无论如何,我仍然保留这个问题和答案,因为对我来说这是一个很难的谜题......(可能对某人有帮助)
作为jpic答案的补充: 我用django中的网址休息framwwork,让我们说; HTTP:\ someurl \ API \照片\\ 并张贴照片。
使用someproperty = bar发布照片avatar_big.png:
使用网址http \ someurl \ api \ photos \ something
将照片保存在照片中\ something \并使用网址http:\ someurl \ api \ photos \ bar
将照片保存在照片\ bar \中问题是(我想,仍然需要检查一下)我用于url的slug名称与fieldname相同。
这是我在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)),
应该做的伎俩......当然也要调整视图