Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django在不同的模型字段上保存图像_Python_Django_Django Signals_Django Models - Fatal编程技术网

Python Django在不同的模型字段上保存图像

Python Django在不同的模型字段上保存图像,python,django,django-signals,django-models,Python,Django,Django Signals,Django Models,我有一个叫Picture的模型。将图像上载到此模型时,将在保存前自动重新调整图像大小 我的主要目标是将上传的图像重新调整为两个独立的图像。所以我可以把它用于不同的用途,比如小图片和大图片。所以我为实现这个目标所做的是创建另一个称为“小”的领域。它代表小图片 我的模型下面有两个函数,分别是save和small。这些功能将自动重新调整图像大小 我的计划是,当我上传一张图片到模型上。我的“保存”功能将自动调整图像大小并将其保存到“图像”文件夹中,但如何让我的小功能从“图像”字段抓取该图像,以便它可以调

我有一个叫Picture的模型。将图像上载到此模型时,将在保存前自动重新调整图像大小

我的主要目标是将上传的图像重新调整为两个独立的图像。所以我可以把它用于不同的用途,比如小图片和大图片。所以我为实现这个目标所做的是创建另一个称为“小”的领域。它代表小图片

我的模型下面有两个函数,分别是save和small。这些功能将自动重新调整图像大小

我的计划是,当我上传一张图片到模型上。我的“保存”功能将自动调整图像大小并将其保存到“图像”文件夹中,但如何让我的小功能从“图像”字段抓取该图像,以便它可以调整图像大小并将其保存到我的小字段中

总而言之,它只是检索一个上传图像并在两个字段上调整图像的大小

class Picture(models.Model):
    user = models.ForeignKey(User)
    small = models.ImageField(upload_to="small/",blank=True,null=True)
    image = models.ImageField(upload_to="images/",blank=True)

    def save(self , force_insert=False,force_update=False):
        super (Picture,self).save(force_insert,force_update)

        pw = self.image.width
        ph = self.image.height
        mw = 500
        mh = 500

        if (pw > mw) or (ph > mh):
            filename = str(self.image.path)
            imageObj = img.open(filename)
            ratio = 1

            if ( pw > mw):
                ratio = mw / float(pw)
                pw = mw
                ph = int(math.floor(float(ph)* ratio))
            if ( ph > mh):
                ratio = ratio * ( mh /float(ph))
                ph = mh 
                pw = int(math.floor(float(ph)* ratio))

            imageObj = imageObj.resize((pw,ph),img.ANTIALIAS)
            imageObj.save(filename)

    def save(self , force_insert=False,force_update=False):
        super (Picture,self).save(force_insert,force_update)

        pw = self.image.width
        ph = self.image.height
        mw = 300
        mh = 300

        if (pw > mw) or (ph > mh):
            filename = str(self.image.path)
            imageObj = img.open(filename)
            ratio = 1

            if ( pw > mw):
                ratio = mw / float(pw)
                pw = mw
                ph = int(math.floor(float(ph)* ratio))
            if ( ph > mh):
                ratio = ratio * ( mh /float(ph))
                ph = mh 
                pw = int(math.floor(float(ph)* ratio))

            imageObj = imageObj.resize((pw,ph),img.ANTIALIAS)
            imageObj.save(filename)

如果这没有意义,请提醒我,以便我可以修改它

您可以创建自定义字段(继承ImageField)或创建预保存信号来处理上载

from django.db.models.signals import pre_save
from django.dispatch import receiver
from myapp.models import MyModel


class MyModel(models.Model):
    # other fields
    image = MyCustomImageField(sizes=(('small', '300x300'), ('large', '500x500')))
信号

@receiver(pre_save, sender=MyModel)
def process_picture(sender, **kwargs):
    # do resizing and storage stuff
更多关于和习惯


这只是一个用作设置的属性,用于定义要创建的缩略图大小。创建缩略图只需要一个函数。看看我发布的工作示例。@Jacob,你正在学习的其实是Python,Django只是使用Python代码。这是一个很好的文档,如果你复制并粘贴它,它可能会开箱即用。仔细阅读它,您应该会有一个基本的理解。字段“只是”一个python类。在示例中定义了自定义字段。让我们来看看为什么不使用它?@Darwin回答得很好,