【问题标题】:Django profile pic upload form saves picture in two foldersDjango个人资料图片上传表单将图片保存在两个文件夹中
【发布时间】:2020-02-16 21:14:45
【问题描述】:

我在 Django 中上传了一组图片,但它保存了 resized 图片在

/媒体

文件夹和原始尺寸图片在

/media/group_pics

文件夹。

models.py:

class Group(models.Model):
    name = models.CharField(max_length=15, unique=True)
    date_created = models.DateField(default=timezone.now)
    image = models.ImageField(default='group_pics/default-group.jpg', upload_to='group_pics/')

    def __str__(self):
        return self.name

    def image_url(self):
        if self.image and hasattr(self.image, 'url'):
            return self.image.url

    def save(self, *args, **kwargs):
        try:
            group = Group.objects.get(id=self.id)
            if not ('default-group.jpg' in group.image.url) and group.image != self.image:
                group.image.delete()
        except: pass
        if not self.slug:
            self.slug = self._get_unique_slug()
        super().save(*args, **kwargs)

forms.py

class GroupUpdateForm(ModelForm):
    image = forms.ImageField(max_length=150, allow_empty_file=False)
    x = forms.FloatField(widget=forms.HiddenInput(), required=False)
    y = forms.FloatField(widget=forms.HiddenInput(), required=False)
    width = forms.FloatField(widget=forms.HiddenInput(), required=False)
    height = forms.FloatField(widget=forms.HiddenInput(), required=False)

    class Meta:
        model = Group
        fields = ['image']


    def save(self):
        group = super(GroupUpdateForm, self).save(commit=False)
        if self.cleaned_data.get('x') != None:
            x = self.cleaned_data.get('x')
            y = self.cleaned_data.get('y')
            w = self.cleaned_data.get('width')
            h = self.cleaned_data.get('height')
            image = Image.open(group.image)
            cropped_image = image.crop((x, y, w+x, h+y))
            resized_image = cropped_image.resize((350, 350), Image.ANTIALIAS)
            resized_image.save(group.image.path)
        group.save()
        return group

当我这样做时

print(group.image.path)

def save(): 下的 forms.py 中,它打印出 media\picture.jpg 而它应该是 media\group_pics\picture.jpg

views.py

if request.method == 'POST':
        update_form = GroupUpdateForm(request.POST, request.FILES, instance=group)
        if update_form.is_valid():
            update_form.save()

预期行为:它只将调整大小的图片保存到/media/group_pics文件夹

如果我使用管理面板,它只会上传到/media/group_pics

通过表单上传图像时导致双图像保存的错误在哪里?

【问题讨论】:

  • 如果您通过管理面板上传图片,其行为是否相同?
  • @revliscano 不,如果我通过管理面板上传,它只会在/media/group_pics folder上传
  • 好的,很明显问题出在表格上。不过,一切似乎都是正确的。保存在 /media 中的图像只是 resized_image 的图像,对吧?
  • @revliscano 是的,我刚刚发现在/media/group_pics 它保存了未调整大小的原始图片。在/media 中,它会保存调整大小的图片。我编辑了原始帖子。
  • 我会在本地做一些测试,看看我是否发现了错误 ;-)

标签: python django image-processing django-models django-forms


【解决方案1】:

尝试使用generate_filename

name = group.image.path
resized_image.save(group.image.generate_filename(group.image, name))

更新模型或重新保存图像时可能会遇到问题。如果确实发生了这种情况,您可能可以将 group.image.path 除以 / 并采用最后一个实例。

name = group.image.path.split('/')[-1]

【讨论】:

  • generate_filename 仅适用于 Storage 类,如果 ModelForm 中有 save 方法,应该如何实现?
  • 对不起,这是一个错误的链接。我以为是 FileField,但它是通用 API。你可以看到字段本身会有一个 generate_filename 方法。尝试使用它。 github.com/django/django/blob/stable/3.0.x/django/db/models/…
猜你喜欢
  • 2023-03-28
  • 1970-01-01
  • 2018-01-28
  • 2020-01-10
  • 2014-04-14
  • 2011-11-07
  • 1970-01-01
  • 2015-05-22
  • 2017-07-10
相关资源
最近更新 更多