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


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM