我正在使用django ModelForm
通过提交包含图像的表单来创建模型实例。由于我想在保存之前裁剪图像,我已经为表单编写了自定义保存。这是代码:
def save(self, commit=True):
product = super(ProductForm, self).save(commit=False)
if self.cleaned_data['x'] is not None:
x = self.cleaned_data['x']
y = self.cleaned_data['y']
x2 = self.cleaned_data['x2']
y2 = self.cleaned_data['y2']
img = product.image
try:
box = (x, y, x2, y2)
except:
print("error!")
try:
# I'm getting wrong path here
to_crop = Image.open(img.path)
cropped = to_crop.crop(box)
except Exception as e:
print(e)
cropped.save()
product.save()
问题是,我的图像路径product.image.path
出错了。更清楚的是,它是Product
模型中的我的图像字段:
image = models.ImageField(upload_to="products", verbose_name=u'عکس', null=True, blank=True)
假设将图像保存在media/products
文件夹中,实际提交表单会将图片保存在正确的位置,但在调试时,product.image.path
的值为 media / img.jpeg < / strong>不 media / products / img.jpeg 。
有什么问题?你能帮我吗?任何关于更有效或更好地完成此任务的建议都将受到赞赏。
答案 0 :(得分:1)
在上传之后,您似乎再次分配了ImageField。请检查以下内容
img.path
应该为您提供绝对路径,img.url
将为您提供相对路径。要测试你的代码,你可以在django shell中执行类似的操作:
>>> p = Person(name="Someone")
>>> p.image.save("myfile.jpg",File(open("img.jpg")),save=True)
您应该导入模型以及from django.core.files import File
现在我们有了图像。我们来检查当前的MEDIA_URL
:
>>> from django.conf import settings
>>> settings.MEDIA_URL
'media/'
回到我们的图片,path
和url
应该为您提供相对和绝对路径:
>>> p.image.path
u'/programs/django/test/media/uploads/pictures/myfile.jpg'
>>> p.image.url
'media/uploads/pictures/myfile.jpg'
现在,让我们看看如果我们直接为p.image
分配内容会发生什么:
>>> p.image = "myfile.jpg"
>>> p.image.url
'media/myfile.jpg'
>>> p.image.path
u'/programs/django/test/media/myfile.jpg'
因此,如您所见,直接设置p.image会忽略upload_to
字段,并且不会创建新文件。
答案 1 :(得分:0)
您可能在实时和调试设置上有不同的MEDIA_ROOT
。如果没有,请尝试使用
python manage.py runserver --verbosity=3