我正在做一个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。
答案 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))