解决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
            }
        }  
      ]  

修改admin.py

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异常错误

posted @ 2016-10-08 09:53  高-岩  阅读(3110)  评论(0编辑  收藏  举报