Как создать имена файлов uuid4 для изображений, загружаемых с помощью Django-CKEeditor?

Я хочу создать произвольные имена файлов uid для изображений, загружаемых с помощью django-ckeditor/uploader.

Я создал utils.py в той же папке, что и settings.py:

import uuid

def get_name_uid():
    ext = filename.split('.')[-1]
    filename = "%s.%s" % (uuid.uuid4(), ext)
    return filename

Я хотел бы добавить это "случайное" имя файла в settings.py:

CKEDITOR_FILENAME_GENERATOR = get_name_uid()

Как я могу это сделать? Я не уверен, как получить имя файла, который загружен в редакторе. Должен ли я передать имя файла из settings.py в utils.py? Или есть другой способ сделать это?

Их документация гласит следующее:

``CKEDITOR_UPLOAD_PATH = "uploads/"``

When using default file system storage, images will be uploaded to "uploads" folder in your MEDIA_ROOT and urls will be created against MEDIA_URL (/media/uploads/image.jpg).

If you want be able for have control for filename generation, you have to add into settings yours custom filename generator.

```
# utils.py

def get_filename(filename):
    return filename.upper()
```

```
# settings.py

CKEDITOR_FILENAME_GENERATOR = 'utils.get_filename'
```

CKEditor has been tested with django FileSystemStorage and S3BotoStorage.
There are issues using S3Storage from django-storages.

1 ответ

Решение

Это в основном все изложено для вас в документах:

def get_filename(filename):
    return filename.upper()  # returns the uppercase version of filename

Так пример функции get_filename получает переданное загруженное имя файла, и вы должны вернуть имя файла, которым хотите, чтобы оно было. Это то, что мы называем обратным вызовом.

То, что обратный вызов передается в качестве аргументов, называется "сигнатура обратного вызова", и документы точно указывают, что он получает.

Поэтому поместите функцию в место, где это имеет смысл. я бы выбрал mysite/mysite/utils.py учитывая структуру, изложенную в руководстве, под заголовком "Давайте посмотрим, что создал startproject:". Так в том же каталоге, что и settings.py, Я бы назвал это generate_uuid4_filename а также mysite/mysite/utils.py будет выглядеть так:

import uuid
import os.path

def generate_uuid4_filename(filename):
    """
    Generates a uuid4 (random) filename, keeping file extension

    :param filename: Filename passed in. In the general case, this will 
                     be provided by django-ckeditor's uploader.
    :return: Randomized filename in urn format.
    :rtype: str
    """
    discard, ext = os.path.splitext(filename)
    basename = uuid.uuid4().urn
    return ''.join(basename, ext)

Теперь обновите ваш settings.py:

# Near the rest of the CKEditor variables
CKEDITOR_FILENAME_GENERATOR = '<app_label>.utils.generate_uuid4_filename'

И вы сделали. Удачи!

Другие вопросы по тегам