Opened 3 years ago

Last modified 3 years ago

#32845 closed Bug

Names of uploaded files cannot be modified. — at Version 1

Reported by: Jacob Fredericksen Owned by: nobody
Component: File uploads/storage Version: 3.2
Severity: Normal Keywords:
Cc: Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description (last modified by Jacob Fredericksen)

According to the Django docs (https://docs.djangoproject.com/en/3.2/topics/files/), I should be able to update the name of an uploaded file like so:

import os
from django.conf import settings
initial_path = car.photo.path
car.photo.name = 'cars/chevy_ii.jpg'
new_path = settings.MEDIA_ROOT + car.photo.name
# Move the file on the filesystem
os.rename(initial_path, new_path)
car.save()
car.photo.path
'/media/cars/chevy_ii.jpg'
car.photo.path == new_path
True

This does not work.

Here is the script I used to test:

            ...
            new_filename = 'sources/new_filename.pdf
            initial_filepath = model_instance.file.path
            assert os.path.exists(initial_filepath)
            new_filepath = os.path.join(settings.MEDIA_ROOT, new_filename)
            input(
                f'{model_instance.file.name} ---> {new_filename}\n'
                f'{initial_filepath} ---> {new_filepath} '
            )
            if os.path.exists(new_filepath):
                raise Exception(f'{new_filepath} already exists.')
            f.file.name = new_filename
            assert os.path.exists(initial_filepath)
            os.rename(initial_filepath, new_filepath)
            sleep(5)
            assert os.path.exists(new_filepath)
            assert not os.path.exists(initial_filepath)
            assert model_instance.file.name == new_filename
            input('Continue? ')
            model_instance.save()
            model_instance.refresh_from_db()
            assert model_instance.file.path == new_filepath, f'{model_instance.file.path} != {new_filepath}'
            print()

Result:

sources/old_filename.pdf ---> sources/new_filename.pdf
/project/media/sources/old_filename.pdf ---> /project/media/sources/new_filename.pdf 
Continue? 
Traceback (most recent call last):
  File "/project/my_script.py", line 108, in <module>
    assert model_instance.file.path == new_filepath, f'{model_instance.file.path} != {new_filepath}'
AssertionError: /project/media/sources/old_filename.pdf != /project/media/sources/new_filename.pdf

I watched the file name (in my file browser) as the script ran. The file name is successfully changed (as demonstrated by the successful assertions above), but it is then reverted to the original file name when the model instance is saved. This would seem to indicate that contrary to the docs, in order to rename a file that is associated with a model instance (as an ImageField or FileField), it is not sufficient to update model_instance.file.name and then use the os module to rename the file.

Change History (1)

comment:1 by Jacob Fredericksen, 3 years ago

Description: modified (diff)
Note: See TracTickets for help on using tickets.
Back to Top