Django профиль pi c форма загрузки сохраняет изображение в две папки - PullRequest
1 голос
/ 17 февраля 2020

Я сделал групповую загрузку изображений в Django, но он сохраняет измененный размер изображение в папке

/ media

и исходный размер изображение в папке

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

в forms.py в def save(): распечатывает 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, если я использую панель администратора .

Где моя ошибка, которая приводит к двойному сохранению изображения при загрузке изображения через форму?

1 Ответ

0 голосов
/ 21 февраля 2020

Попробуйте использовать 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]
...