Django编码路径名

时间:2016-07-05 19:04:16

标签: python django encoding utf-8

我正在做一个Django项目,期望非ascii字符,比如àéã等。到目前为止,我已经能够很好地导航这个编码地狱了,但是我遇到了上传文件的路径名问题。

我有一个可读的模型:

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

upload_to根据city字段(可以包含非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'编解码器无法编码位置7中的字符u'\ xe1':序数不在范围内(128) 。相反,如果我强制编码:

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

我收到以下错误: IOError [Errno 2]没有这样的文件或目录:'C:\ Django_project \ Storage \ Property \ Bras \ 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 在顶部有# - * - coding:utf-8 - * - ,导入了unicode_literals。

1 个答案:

答案 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))