在自定义ModelForm保存中获取错误的图像路径

时间:2014-01-16 07:17:02

标签: django image crop django-forms

我正在使用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

有什么问题?你能帮我吗?任何关于更有效或更好地完成此任务的建议都将受到赞赏。

2 个答案:

答案 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/'

回到我们的图片,pathurl应该为您提供相对和绝对路径:

>>> 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