【问题标题】:resizing image using pil while uploading in django在 django 中上传时使用 pil 调整图像大小
【发布时间】:2018-05-24 16:56:33
【问题描述】:

检查了许多其他答案,但没有找到所需的内容!我正在做一个 Django 项目,我必须让用户上传照片,现在我需要调整照片的大小以适应它的显示位置

这是我的文件:

模型

class Item(models.Model):
    # custom validators
    alphanumeric = RegexValidator(r'^[0-9a-zA-Z]*$', 'Only alphanumeric characters are allowed.')

    # fields
    dress_name = models.ForeignKey(Name, on_delete='DO_NOTHING', null=False, verbose_name='وصف الفستان',)
    dress_size = models.ForeignKey(Size, on_delete='DO_NOTHING', verbose_name='مقاس الفستان')
    dress_color = models.ForeignKey(Color, on_delete='DO_NOTHING', verbose_name='لون الفستان')
    dress_image1 = models.FileField(upload_to='documents/%Y/%m/%d', null=False, verbose_name='الصورة الأساسية للفستان',
                                     help_text='لا يمكنك تركها فارغة',)
    dress_image2 = models.ImageField(upload_to='documents/%Y/%m/%d', null=True, verbose_name='صورة إضافية ')
    dress_image3 = models.ImageField(upload_to='documents/%Y/%m/%d', null=True, verbose_name='صورة إضافة ')
    dress_action = models.ForeignKey(Action, on_delete='DO_NOTHING', verbose_name='الفستان معروض لل ',
                                     help_text='للبيع او للإيجار ')
    dress_price = models.IntegerField(default=1, verbose_name='السعر')
    dress_country = models.ForeignKey(Country, on_delete='CASCADE', verbose_name='البلد')
    dress_city = models.CharField(max_length=80, verbose_name='المدينة او المحافظة')
    dress_mobile = models.CharField(max_length=20, validators=[alphanumeric], verbose_name='رقم الهاتف ')
    created_by = models.CharField(max_length=250,)
    created_username = models.CharField(max_length=250, default='unknown')
    created_at = models.DateTimeField(auto_now=True)
    dress_active = models.BooleanField(default=False)
    dress_special = models.BooleanField(default=False)

表格

class AddDressForm(ModelForm):
    class Meta:
        model = Item
        exclude = ['created_by', 'created_at','dress_active','dress_special','created_username']

    def clean_image(self):
        image = self.cleaned_data.get('image', False)
        if image:
            if image._size > 4*1024*1024:
                raise ValidationError("Image file too large ( > 4mb )")
            return image
        else:
            raise ValidationError("Couldn't read uploaded image")

最后是观看次数

def dress_add(request):
    all_name = Name.objects.all()
    current_user = request.user
    if request.method == "POST":
        add_dress_form = AddDressForm(request.POST, request.FILES)
        if add_dress_form.is_valid():
            model_instance = add_dress_form.save(commit=False)
            model_instance.created_by = current_user.first_name
            model_instance.created_username = current_user.username
            if model_instance.dress_image1:
                model_instance.dress_image1 = Image.open(model_instance.dress_image1)
                model_instance.dress_image1.resize((1000, 1000), Image.ANTIALIAS)
                thumb_io = BytesIO()
                model_instance.dress_image1.save(thumb_io, model_instance.format, quality=60 )
                model_instance.image.save(model_instance.filename, ContentFile(thumb_io.get_value()), save=False)
            model_instance.save()
            return redirect('dress_confirm')

    else:
        add_dress_form = AddDressForm()

    context = {
        'add_dress_form':add_dress_form,
        'current_user':current_user,
        'all_name':all_name,

    }

    return render(request, 'fostan/dress_add.html', context)

我尝试使用 PIL lib 中的 resize 方法来调整图像大小,但它给了我一个错误

错误

`'Item' 对象没有属性 'format'

部分解决

1 - 更改为 model_instance.dress_image1.save(thumb_io, model_instance.format, quality=60 )

像:

model_instance.dress_image1.save(thumb_io, model_instance.dress_image1.format, quality=60 ) 2 - 然后将 model_instance.filename 更改为 model_instance.dress_image1.filename `

3-然后更改model_instance.image.save(model_instance.filename, ContentFile(thumb_io.get_value()), save=False) 为`model_instance.dress_image1.save(model_instance.dress_image1.filename, ContentFile(thumb_io.getvalue()), save=False)

错误

那么现在我有一个新的错误是

'ContentFile' object has no attribute 'upper'

【问题讨论】:

    标签: python django


    【解决方案1】:

    问题出在这一行:

    model_instance.dress_image1.save(thumb_io, model_instance.format, quality=60 )
    

    你可能想要这个:

    model_instance.dress_image1.save(thumb_io, model_instance.dress_image1.format, quality=60 )
    

    【讨论】:

    • 'Item' object has no attribute 'filename' 仍然返回错误!
    • @AhmedWagdi 这只是第一个提示。同样的想法,下一行的model_instance.filename 是错误的。应该类似于model_instance.dress_image1.filename
    • 谢谢大家这是正确的步骤,因为现在我在最后一行出现错误'_io.BytesIO' object has no attribute 'get_value'
    猜你喜欢
    • 2012-09-29
    • 2011-02-20
    • 2017-04-01
    • 2012-06-09
    • 2012-12-01
    • 2014-12-07
    • 2022-01-23
    • 2017-06-26
    • 2015-08-06
    相关资源
    最近更新 更多