Загрузка изображения в Django ImageField

#python #django

#python #django

Вопрос:

Я пытаюсь протестировать свою модель с помощью ImageField, для этого я читаю файл .jpg в двоичном режиме и сохраняю в модели. Я нахожу много вопросов в StackOverflow, но, похоже, у меня ничего не работает.

 testImagePath = os.path.join(settings.BASE_DIR, 'test_image_folder/test_image.jpg')

"image" : SimpleUploadedFile(name='test_image.jpg', content=open(testImagePath, 'rb').read(), content_type='image/jpeg')
  

ошибка:

Ошибка UnicodeDecodeError: кодек ‘utf-8’ не может декодировать байт 0xff в позиции 0: недопустимый начальный байт

test.py

 class Test(TestCase):

    testUser = {
           "username": "TestUser",
           "email": "TestUser@mail.com",
           "password": "TestUserPassword",
           "confirm_password": "TestUserPassword"
        }
    testAlbum = {
            "owner" : testUser['username'],
            "name" : "Test Album"
        }
    testImagePath = os.path.join(settings.BASE_DIR, 'test_image_folder/test_image.jpg')
    testPhoto = {
            "owner" : testUser['username'],
            "album" : testAlbum['name'],
            "name" : "Test Photo",
            "image" : SimpleUploadedFile(name='test_image.jpg', content=open(testImagePath, 'rb').read(), content_type='image/jpeg')
        }
    def setUp(self):
        self.client = APIClient()
        self.registerTestUser()
...

    def test_photos_urls(self):
        response = self.client.post('/api/photos/', self.testPhoto, format="json")
        self.assertEqual(response.status_code, status.HTTP_201_CREATED, msg=response.content)
  

сериализатор:

 class PhotoSerializer(serializers.HyperlinkedModelSerializer):
    album = serializers.HyperlinkedRelatedField(view_name='album-detail', queryset=Album.objects)
    owner = serializers.ReadOnlyField(source='owner.username')

    class Meta:
        model = Photo
        fields = ('pk', 'name', 'image', 'creation_date', 'owner', 'album',)
        read_only_fields=('creation_date',)
  

Вид:

 class PhotoViewSet(viewsets.ModelViewSet):
    queryset = Photo.objects.all()
    serializer_class = PhotoSerializer 
    permission_classes = (permissions.IsAuthenticatedOrReadOnly, IsOwnerOrReadOnly,)

    def perform_create(self, serializer):
        serializer.save(owner=self.request.user)
  

Модель:

 class Photo(models.Model):
    album = models.ForeignKey(Album, related_name='photos', on_delete=models.CASCADE)
    owner = models.ForeignKey(User,  related_name='user_photos', on_delete=models.CASCADE)
    name = models.CharField(max_length=80, default='New photo')
    image = models.ImageField(name, upload_to=get_image_path)
    creation_date = models.DateField(auto_now_add=True)

    def __str__(self):
        return self.name

    class Meta:
        ordering = ['creation_date', ]
  

Полная трассировка ошибки:

Трассировка (последний последний вызов): файл «D:codeactivePythonDjangophoto-hubphoto-hubapitests.py «, строка 66, в файле test_photos_urls response = self.client.post(‘/api/photos/’, self.testPhoto, format=»json») «C:UsersUserAppDataLocalProgramsPythonPython35-32libsite-packagesrest_frameworktest.py «, строка 172, в пути сообщения, данные=данные,формат =формат, content_type=content_type, ** дополнительный) файл «C:UsersUserAppDataLocalProgramsPythonPython35-32libsite-packagesrest_frameworktest.py «, строка 93, в данных post, content_type = self._encode_data(данные, формат, content_type) Файл «C:UsersUserAppDataLocalProgramsPythonPython35-32libsite-packagesrest_frameworktest.py «, строка 65, в файле _encode_data ret = renderer.render(данные) «C:UsersUserAppDataLocalProgramsPythonPython35-32libsite-packagesrest_frameworkrenderers.py» , строка 103, в файле render separators=разделители «C:UsersUserAppDataLocalProgramsPythonPython35-32libjson__init__.py «, строка 237, в дампах **kw).encode(obj) Файл «C:UsersUserAppDataLocalProgramsPythonPython35-32libjsonencoder .py», строка 198, в файле encode chunks = self.iterencode(o, _one_shot=True) «C:UsersUserAppDataLocalProgramsPythonPython35-32libjsonencoder.py «, строка 256, в iterencode возвращает файл _iterencode(o, 0) «C:UsersUserAppDataLocalProgramsPythonPython35-32libsite-packagesrest_frameworkutilsencoders.py» , строка 54, по умолчанию возвращает obj.decode(‘utf-8’) UnicodeDecodeError:кодек ‘utf-8’ не может декодировать байт 0xff в позиции 0: недопустимый начальный байт

Комментарии:

1. Попробуйте это как: testImagePath = os.path.join(настройки. BASE_DIR, ‘test_image_folder’)

2. И после этого читать папку вместо файла?

3. Пожалуйста, укажите немного больше деталей вашей проблемы. пожалуйста, покажите свой код (views.py , models.py , шаблон и т.д.) для получения более подробной информации.

Ответ №1:

ImageField необходимо получить файл, а не данные. Это решает проблему:

 "image" : open(os.path.join(settings.BASE_DIR, 'test_image_folder/test_image.jpg'), 'rb')