2016-07-05 4 views
0

àéãなどの非アスキー文字を必要とするDjangoプロジェクトを行っています。これまでのところ、このエンコーディングをうまく操作できましたが、パス名に問題がありますアップロードされたファイルのupload_toは、非ASCII文字を持つことができるフィールドである(都市フィールドに基づいて、ファイルを保存するためのパスを作成する関数を呼び出しますDjangoでパス名のエンコーディングに問題があります

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

私は、このように読み込むモデルを持っています):

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 \ストレージ\プロパティ\ブラジャー\ 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

ありがとう!状況によってはプロジェクトでこれをテストすることができませんでしたが、私は別のプロジェクトでそれをテストしてうまくいくようです。 –

関連する問題