我正在使用文件名中的unicode字符将文件上传到我的Django模型,但是当显示名称时,它们会被删除或更改为最接近的ascii字符。我检查了上传路径功能,此时它仍然正确编码。
-> return u'proposal_documents/{0}/{1}'.format(instance.proposal.pk, filename)
(Pdb) x = u'proposal_documents/{0}/{1}'.format(instance.proposal.pk, filename)
(Pdb) x
u'proposal_documents/22872/\xa9\u02da\u2206\u222b\u02dau\u0308\u2122\xa2.png'
我还检查了文件的已清理数据,并且文件也在那里正确显示。
-> for file_ in pdform.cleaned_data['files']:
(Pdb) pdform.cleaned_data['files']
[<InMemoryUploadedFile: ©˚∆∫˚ü™¢.png (image/png)>]
但是,检查模型时,非ascii字符已更改。
(Pdb) models.ProposalDocument.objects.order_by('-created_at')
<QuerySet [<ProposalDocument: u.png>, ...
在模型实例的文件路径中重申了这一点
(Pdb) models.ProposalDocument.objects.order_by('-created_at').first().file.name
u'proposal_documents/22872/u.png'
以下是模型(删除了import pdb; pdb.set_trace()
)
def proposal_doc_upload_path(instance, filename):
return u'proposal_documents/{0}/{1}'.format(instance.proposal.pk, filename)
class ProposalDocument(models.Model):
proposal = models.ForeignKey(Proposal, on_delete=models.CASCADE, related_name='documents')
file = models.FileField(upload_to=proposal_doc_upload_path, max_length=500, blank=True)
created_at = models.DateTimeField(auto_now=True)
created_by = models.ForeignKey(Employee, on_delete=models.CASCADE)
def __str__(self):
return self.file.name.rsplit('/')[-1].encode('utf-8')
如何更改代码以使unicode字符保持不变? 我正在使用Django 1.10和Python 2.7