2016-07-05 2 views
0

Я делаю проект Django, который ожидает символов не-ascii, таких как àéã и т. Д. До сих пор я мог хорошо ориентироваться в этом кодировании, но у меня проблемы с именами путей загруженных файлов.Проблемы с кодировкой Django с именем пути

У меня есть модель, которая читает таким образом:

class Property (models.Model): 
    #... 
    city = models.CharField(max_length = 100, choices = CITIES_LIST) 
    pdf_file = models.FileField(upload_to = generateUploadPath) 

upload_to вызывает функцию, которая создает путь для сохранения файла, основанный на поле города (это поле, которое может иметь не-ASCII символы):

def generateUploadPath (instance, file): 
    city = instance.city 
    storage_path = r'Property\{city}\{file}'.format(city = city, file = file) 
    return storage_path 

Это хорошо работает. Папки создаются, если они не существуют, с правильными именами, и файлы хранятся там правильно. Проблема заключается в том, у меня есть сигнал post_save, который считывает сказал файл и обрабатывает его определенным образом:

@receiver(signals.post_save, sender = Property) 
def fileProcessing (sender, instance, created, **kwargs): 

    file_path = instance.pdf_file.path 
    pdf_file = open(file_path, 'r') 

Вот где код брейки. Если это делается, при запуске формы появляется следующая ошибка: UnicodeEncodeError: кодек 'ascii' не может кодировать символ u '\ xe1' в позиции 7: порядковый номер не в диапазоне (128). Если я, вместо того, заставлять кодировку с:

file_path = instance.pdf_file.path.encode('utf-8') 

Я получаю следующее сообщение об ошибке: IOError: [Errno 2] Нет такого файла или каталога: «C: \ Django_project \ Storage \ Недвижимость \ Бюстгальтеры \ xc3 \ xadlia \ test_file.pdf ', хотя папка правильно создана в Windows как «.. \ Property \ Brasília \».

Весь проект находится в UTF-8, я использую Python 2.7.11, Django 1.9.4, db - Postgres 9.5, а кодировка базы данных также установлена ​​в UTF-8. Мой models.py имеет # - * - код: utf-8 - * - сверху, с импортированными unicode_literals.

+0

Этот вопрос был по поводу проблемы с прямыми и обратными косыми чертами в именах путей - мина о кодировании. Разные темы. –

ответ

0

Использование python_2_unicode_compatible декоратор:

from django.utils.encoding import python_2_unicode_compatible, force_text 

@python_2_unicode_compatible 
class Property (models.Model): 
    #... 
    city = models.CharField(max_length = 100, choices = CITIES_LIST) 
    pdf_file = models.FileField(upload_to = generateUploadPath) 

    def __str__(self): 
     return force_text(self.pdf_file.path) 

    def __unicode__(self): 
     return force_text(unicode(self.pdf_file.path)) 

    def get_file_path(self): 
     return force_text(unicode(self.pdf_file.path))  
+0

Спасибо! Я не смог проверить это в своем проекте из-за обстоятельств, но я протестировал его в другом проекте и, похоже, отлично работает. –

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