解决Django的admin界面中文乱码
解决Django的admin界面中文乱码
问题陈述
最近在做一个很小的Django项目时,使用了自带的sqlite作为数据库。后台admin界面在显示中文数据时,总会遇到乱码。这里截取一小部分代码:
models.py文件
# _*_ coding:utf-8 _*_
from __future__ import unicode_literals
from django.db import models
from django.core.urlresolvers import reverse
# Create your models here.
class FatherMenu(models.Model):
title = models.CharField(u"菜单名", max_length=20)
slug = models.CharField(u"链接", max_length=100, db_index=True)
son = models.BooleanField("子菜单?", default=False)
class Meta:
verbose_name = u"一级菜单"
verbose_name_plural = u"一级菜单"
def __str__(self):
return self.title
导入数据data.json,例如:
[
{
"model":"seclab.FatherMenu",
"pk":1,
"fields":
{
"title":"首页",
"slug":"/",
"son":0
}
},
{
"model":"seclab.FatherMenu",
"pk":2,
"fields":
{
"title":"概况",
"slug":"/introduction/",
"son":0
}
},
{
"model":"seclab.FatherMenu",
"pk":3,
"fields":
{
"title":"动态",
"slug":"/dynamic/",
"son":1
}
}
]
from django.contrib import admin
# Register your models here.
from models import *
class FatherMenuAdmin(admin.ModelAdmin):
list_play = ('title', 'slug', 'son')
admin.site.register(FatherMenu, FatherMenuAdmin)
导入数据、创建superuser、运行server
python manage.py makemigrations
python manage.py migrate
python manage.py loaddata fatherMenu.json
python manage.py createsuperuser --username admin --email blank
python manage.py runserver 0.0.0.0:8080
登入到后台的admin界面,假设查看一级菜单->首页
,就会报错:
UnicodeEncodeError at /admin/seclab/fathermenu/1/change/
'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
Unicode error hint
The string that could not be encoded/decoded was: 首页
解决
试了几次发现,只要在models.py
中,每个__self__
函数返回的字段包含中文,就会在admin界面引发上述UnicodeEncodeError
。
具体到本例,__self__
函数返回了self.title
,表示菜单名,而导入数据时每个title
字段都是像首页、概况、动态这样的中文。
搜到了两种解决方法,可以任选一种:
1.用__unicode__
函数代替__str__
原先写的模型代码中的方法用提 def __str__(self):
这个是旧版本中用的方法,在Django 0.96以后的版本中,应该换成 def __unicode__(self):
, 这样就解决了字符串传递时出错的问题,统一编码为Unicode字符串。
class FatherMenu(models.Model):
···
def __unicode__(self):
return self.title
引自:Django报错UnicodeEncodeError: 'ascii' codec can't encode characters 之解决方法
2.使用sefdefaultencoding
函数
# _*_ coding:utf-8 _*_
from __future__ import unicode_literals
from django.db import models
from django.core.urlresolvers import reverse
# Create your models here.
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
class FatherMenu(models.Model):
···
引自:解决Python2.7的UnicodeEncodeError: ‘ascii’ codec can’t encode异常错误