如何让Django prepopulated_fields与中文一起使用?

时间:2015-11-15 15:26:04

标签: django slug unidecoder

我的项目中包含一个名为unidecode的python包,它可以很好地解码中文字符。但是当我在我的Django项目中使用它时,prepopulated_fields并不适用于中文。

版本信息:django 1.86,Python 3.4

Models.py

# coding:utf-8

from django.template.defaultfilters import slugify
from django.db import models
from django.contrib import admin
from unidecode import unidecode

# 类别
class Category(models.Model):

    name = models.CharField(max_length=128, unique=True)
    likes = models.IntegerField(default=0)
    slug = models.SlugField(unique=True)

    class Meta:
        # 定义显示的名字
        verbose_name = '类别'
        verbose_name_plural = '类别'

    def save(self,*args,**kwargs):
        self.slug = slugify(unidecode(self.name))
        super(Category,self).save(*args,**kwargs)

    def __str__(self):
        return self.name

class CategoryAdmin(admin.ModelAdmin):
    prepopulated_fields = {'slug':(unidecode('name'),)}



# 文章类
class Article(models.Model):
    title = models.CharField(u'标题', max_length=256)
    content = models.TextField(u'内容')
    pub_date = models.DateTimeField(u'发表时间', auto_now_add=True, editable=True)
    update_time = models.DateTimeField(u'更新时间',auto_now=True, null=True)
    category = models.ForeignKey(Category)          #ForeignKey, 创建1对多关系的字段类型.

    class Meta:
        verbose_name = '文章'
        verbose_name_plural = '文章'

    def __str__(self):
        return self.title       #按照标题来显示每个实例,也就是一行数据

admin.py

# coding:utf-8
from django.contrib import admin
from .models import Article, Category ,CategoryAdmin


from django_summernote.admin import SummernoteModelAdmin
class SomeModelAdmin(SummernoteModelAdmin):
    pass


# 注册
admin.site.register(Article,SomeModelAdmin)
admin.site.register(Category,CategoryAdmin)

当我输入一些中文字符时,我想看到slug字段是这样自动填充的: enter image description here

但事实是,在Django管理员中,slug字段没有被这样的任何字符自动填充: enter image description here

1 个答案:

答案 0 :(得分:0)

From the docs

  

将prepopulated_fields设置为字典,将字段名称映射到它应该预先填充的字段:

class ArticleAdmin(admin.ModelAdmin):
    prepopulated_fields = {"slug": ("title",)}
     

设置后,给定的字段将使用一些JavaScript来填充指定的字段。

由于您没有与unidecode('name')输出相对应的字段,因此javascript可能会失败。

将其更改为:

prepopulated_fields = {'slug':('name',)}

它应该有用。