Проблема с получением content_type изображения, когда другие поля также присутствуют в форме - PullRequest
0 голосов
/ 31 марта 2019

У меня есть следующая модель формы:

class ImageModelForm(FilesForm):

    class Meta:
        model = Image
        fields = ['image', 'order_id']


class FilesForm(forms.ModelForm):

   def save(self, commit=True):
        obj = super().save(commit=False)

        for field, value in self.fields.items():
            if isinstance(value, forms.FileField) and obj:
                    obj.filename = truncate_filename(self.cleaned_data[field].name.lower())
                    obj.file_type = self.cleaned_data[field].content_type.lower()
        # commit is False usually in Admin - check to work also in Admin
        if commit:
            obj.save()
        return obj

class Image(FileAttributesModel):

    item = models.ForeignKey('Item', on_delete=models.CASCADE)
    image = models.ImageField(upload_to=file_upload_to, max_length=500)
    order_id = models.SmallIntegerField(default=0)

class FileAttributesModel(models.Model):
    filename = models.CharField(max_length=255, blank=True, null=True)
    file_type = models.CharField(max_length=255, blank=True, null=True)

    class Meta:
        abstract = True

Если я удаляю 'order_id' из формы или не изменяю его значение, оно работает, в противном случае я получаю:

 'ImageFieldFile' object has no attribute 'content_type'

При трассировке отслеживается ошибка при сохранении:

obj.file_type = self.cleaned_data[field].content_type.lower()

В обоих случаях поле имеет вид: image

но, без изменения значения на order_id

{'file': <_io.BytesIO object at 0x0000000005F7CE08>, '_name': 'broad-range.png', 'size': 76310, 'content_type': 'image/png', 'charset': None, 'content_type_extra': {}, 'field_name': 'image-1-image', 'image': <PIL.PngImagePlugin.PngImageFile image mode=RGB size=1000x468 at 0x64B8A20>}

с измененным идентификатором заказа:

{'_file': None, 'name': /images/broad-range.png', 'instance': <Image: images/06_axft.jpg>, 'field': <django.db.models.fields.files.ImageField: image>, 'storage': <django.core.files.storage.DefaultStorage object at 0x00000000038FEDD8>, '_committed': True}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...