我在django的FilePathField中设置recursive = True时的UnicodeDecodeError

时间:2014-09-09 11:55:48

标签: python django

我在admin中添加记录时发生错误。我的模型就像

class THMusic(models.Model):
     originmusic = models.ForeignKey(Originalmusic)
     name = models.CharField(max_length=100)
     audiofile = models.FilePathField(path=os.path.dirname(os.path.abspath(__file__))+'/resource', recursive=True)
     team = models.CharField(max_length=50)
     album = models.CharField(max_length=50)
class THMusicAdmin(admin.ModelAdmin):
     list_display = ('name', 'originmusic', )

但我得到了UnicodeDecodeError:

  

/ admin / thmusic / thmusic / add /

中的UnicodeDecodeError
'ascii' codec can't decode byte 0xe3 in position 54: ordinal not in range(128)

Request Method:     GET
Request URL:    http://127.0.0.1:8006/admin/thmusic/thmusic/add/
Django Version:     1.6.5
Exception Type:     UnicodeDecodeError
Exception Value:    

'ascii' codec can't decode byte 0xe3 in position 54: ordinal not in range(128)

Exception Location:     /usr/local/lib/python2.7/dist-packages/django/forms/fields.py in __init__, line 1057
Python Executable:  /usr/bin/python2.7
Python Version:     2.7.6
Python Path:    

['/home/hyzhappy/djangoprojects/myblog',
 '/usr/local/lib/python2.7/dist-packages/simplejson-3.6.3-py2.7-linux-i686.egg',
 '/home/hyzhappy/djangoprojects/myblog',
 '/usr/lib/python2.7',
 '/usr/lib/python2.7/plat-i386-linux-gnu',
 '/usr/lib/python2.7/lib-tk',
 '/usr/lib/python2.7/lib-old',
 '/usr/lib/python2.7/lib-dynload',
 '/usr/local/lib/python2.7/dist-packages',
 '/usr/local/lib/python2.7/dist-packages/PIL',
 '/usr/lib/python2.7/dist-packages',
 '/usr/lib/python2.7/dist-packages/PILcompat',
 '/usr/lib/python2.7/dist-packages/gst-0.10',
 '/usr/lib/python2.7/dist-packages/gtk-2.0',
 '/usr/lib/pymodules/python2.7',
 '/usr/lib/python2.7/dist-packages/ubuntu-sso-client',
 '/usr/lib/python2.7/dist-packages/wx-2.8-gtk2-unicode']

如果我删除" recursice = True"在FilePathField中,它会很顺利。但这不是我的期望 更多细节

  

Unicode错误提示       无法编码/解码的字符串是:urce /������       UnicodeDecodeError(' ascii',' / home / hyzhappy / djangoprojects / myblog / thmusic / resource / \ xe3 \ x83 \ x97 \ xe3 \ x83 \ xac \ xe3 \ x82 \ xa4 \ xe3 \ x83 \ xa4 \ xe3 \ x83 \ xbc \ xe3 \ x82 \ xba \ xe3 \ x82 \ xb9 \ xe3 \ x82 \ xb3 \ xe3 \ x82 \ xa2.mp3',54,55,'序数不在范围内(128)&#39)

2 个答案:

答案 0 :(得分:0)

可能不是正确的答案,但您可以将其视为可能的原因。

有时候在Django中(我有与tastypie相同的情况),因为一个初始无关的错误试图显示但由于奇怪的字符而不能出现UnicodeDecodeError。

在我的情况下,这是因为我在我的代码注释(不是ascii)中添加了法语口音。这通常不会产生错误,但是当某个地方实际出现错误并且Django试图在调试模式下显示此错误时,它不能因为非ascii字符而引发UnicodeDecodeError而不是引发初始错误。

只是尝试删除代码中的任何可疑字符(如果有),然后再次检查错误是否仍然相同。

答案 1 :(得分:0)

幕后,FilePathField使用os.walk / os.listdir来查找文件。这些功能有两种模式" python中的操作:字节串和unicode。模式是根据给定的路径类型选择的,即如果您为其提供unicode字符串,则生成的文件列表将为unicode,否则将为字节字符串。

因此,要解决此问题,只需向FilePathField提供一个unicode路径,如下所示(请注意u开头的u'/resource'):

audiofile = models.FilePathField(path=os.path.dirname(os.path.abspath(__file__))+u'/resource', recursive=True)