2016-07-21 3 views
0

Моя модель:Джанго: FileField имя специальные символы заменяются автоматически

class MyFile(models.Model): 
    file = models.FileField(upload_to="myfiles", max_length=500) 
    slug = models.SlugField(max_length=500, blank=True) 

Когда имена файлов содержат специальные символы, такие как ' «(пробел), специальные символы будут заменены подчеркиванием автоматически. Где (в какой функции) это происходит? Как отключить автоматическую проверку?

Благодаря

UPDATE

Любые комментарии по следующим кодам? Thanks

""" 
https://docs.djangoproject.com/en/1.9/_modules/django/core/files/storage/#Storage.get_valid_name 
Overwrite get_valid_name() function, 
""" 
class OverwriteStorage(FileSystemStorage): 
    def get_valid_name(self, name): 
     print "name=", name 
     return name 

class MyFile(models.Model): 
    file = models.FileField(upload_to="myfiles", max_length=500, storage=OverwriteStorage()) 
+0

Что это за особый символ? Одиночные кавычки? Иногда ваша оболочка заменяет эти символы. Это похоже на то, что вы прикасаетесь к новому файлу в своей оболочке со специальными символами в имени файла. –

+0

@ShangWang, например. space – BAE

+0

ваше решение правильное, если вы используете его только для одной модели, вы можете проверить мой обновленный ответ, если вы хотите установить глобально – fodma1

ответ

0

Это зависит от вашего хранилища. FileField звонки storage.get_valid_name на sotrage. ref

Возможно, вы можете переписать эту функцию (в зависимости от вашего хранилища), но я думаю, что, вероятно, лучше оставить ее такой, какой она есть. Вы всегда можете использовать поле имени.

Если вы используете FileSystemStorage, он назовёт django.utils.text.py, что заменяет места символами подчеркивания. ref

Edit:

Предполагая, что вы используете по умолчанию FileSystemStorage вот как изменить его:

создать файл (возможно, в вас главное приложение)

storage.py:

from django.core.files.storage import FileSystemStorage 
from django.utils.deconstruct import deconstructible 


@deconstructible 
class CustomFileSystemStorage(FileSystemStorage): 

    def get_valid_name(self, name): 
     return name 

(вам может понадобиться декоратор @deconstructible r)

Теперь у вас есть два варианта использования этого хранилища. Вы можете либо указать это в вас модели в явном виде:

Моя модель:

class MyFile(models.Model): 
    file = models.FileField(upload_to="myfiles", max_length=500, storage=CustomFileSystemStorage) 
    slug = models.SlugField(max_length=500, blank=True) 

Или вы можете установить его в глобальном масштабе в вашем settings.py:

DEFAULT_FILE_STORAGE = '{yourapp}.storage.CustomFileSystemStorage' 

ref

+0

как его переписать? Любые примеры? – BAE

0

Реализация в django source code. Я не совсем уверен, как его отключить, почему бы не оставить его таким, каким он есть?

Смежные вопросы