Django:越南语中的 Slug 工作不正确
Django: Slug in Vietnamese working not correctly
我开始使用 Django 框架开发网站在线商店。我遇到了一个问题,我想将越南语 "những-viên-kẹo" 的名称更改为 "nhung-vien-keo"。我读过这篇文章:
Django: Slug in Vietnamese
然后我在 model.py 上做了这样的事情:
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models
from django.template.defaultfilters import slugify
class Category(models.Model):
name = models.CharField(max_length=50)
slug = models.CharField(max_length=50, unique=True,help_text = 'Unique value for product page URL, created from name.')
description = models.TextField()
is_active = models.BooleanField(default=True)
meta_keywords = models.CharField("Meta Keywords", max_length=255, help_text='Comma-delimited set of SEO keywords for meta tag')
meta_description = models.CharField("Meta Description", max_length=255, help_text = 'Content for description meta tag')
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
db_table = 'categories'
ordering = ['-created_at']
verbose_name_plural = 'Categories'
def __unicode__ (self):
return self.name
@models.permalink
def get_absolute_url(self):
return ('catalog_category', (), { 'category_slug': self.slug })
但是当我在管理页面的名称字段中键入 "những-viên-kẹo" 时,slug 字段出现 "nhng-vien-ko"。我不知道有什么问题。
当我 运行 测试时:
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
vietnamese_map = {
ord(u'ư'): 'u',
ord(u'ơ'): 'o',
ord(u'á'): 'a',
ord(u'n'): 'n',
ord(u'h'): 'h',
ord(u'ữ'): 'u',
ord(u'n'): 'n',
ord(u'g'): 'g',
ord(u'v'): 'v',
ord(u'i'): 'i',
ord(u'ê'): 'e',
ord(u'n'): 'n',
ord(u'k'): 'k',
ord(u'ẹ'): 'e',
ord(u'o'): 'o',
}
print unicode("những-viên-kẹo").translate(vietnamese_map)
它工作正常,return "nhung-vien-keo"
[编辑]
我已经在 form.py
上试过了
class CategoryAdminForm(forms.ModelForm):
class Meta:
model = Category
exclude = ()
def clean_slug(self):
slug = self.cleaned_data['slug']
vietnamese_map = {
ord(u'ư'): 'u',
ord(u'ơ'): 'o',
ord(u'á'): 'a',
ord(u'n'): 'n',
ord(u'h'): 'h',
ord(u'ữ'): 'u',
ord(u'n'): 'n',
ord(u'g'): 'g',
ord(u'v'): 'v',
ord(u'i'): 'i',
ord(u'ê'): 'e',
ord(u'n'): 'n',
ord(u'k'): 'k',
ord(u'ẹ'): 'e',
ord(u'o'): 'o',
}
slug = slugify(unicode(slug).translate(vietnamese_map))
return slug
并且在admin.py
class CategoryAdmin(admin.ModelAdmin):
form = CategoryAdminForm
# sets up values for how admin site lists categories
list_display = ('name', 'created_at', 'updated_at',)
list_display_links = ('name',)
list_per_page = 20
ordering = ['name']
search_fields = ['name', 'description', 'meta_keywords', 'meta_description']
exclude = ('created_at', 'updated_at',)
# sets up slug to be generated from category name
prepopulated_fields = {'slug': ('name',)}
admin.site.register(Category, CategoryAdmin)
但是还是不行!
我已经解决了这个问题。首先,我定义了一个包含键值对的映射。 Key 是 UTF-8 中的越南语字符。然后我用这个将一些特殊字符转换为相关的英文:
def vi_slug(data):
vietnamese_map = {
ord(u'o'): 'o', ord(u'ò'): 'o', ord(u'ó'): 'o', ord(u'ỏ'): 'o', ord(u'õ'): 'o', ord(u'ọ'): 'o',
ord(u'ơ'): 'o', ord(u'ờ'): 'o', ord(u'ớ'): 'o', ord(u'ở'): 'o', ord(u'ỡ'): 'o', ord(u'ợ'): 'o',
ord(u'ô'): 'o', ord(u'ồ'): 'o', ord(u'ố'): 'o', ord(u'ổ'): 'o', ord(u'ỗ'): 'o', ord(u'ộ'): 'o',
ord(u'à'): 'a', ord(u'á'): 'a', ord(u'á'): 'a', ord(u'ả'): 'a', ord(u'ã'): 'a', ord(u'ạ'): 'a',
ord(u'ă'): 'a', ord(u'ắ'): 'a', ord(u'ằ'): 'a', ord(u'ẳ'): 'a', ord(u'ẵ'): 'a', ord(u'ạ'): 'a',
ord(u'â'): 'a', ord(u'ầ'): 'a', ord(u'ấ'): 'a', ord(u'ậ'): 'a', ord(u'ẫ'): 'a', ord(u'ẩ'): 'a',
ord(u'đ'): 'd', ord(u'Đ'): 'd',
ord(u'è'): 'e', ord(u'é'): 'e', ord(u'ẻ'): 'e', ord(u'ẽ'): 'e', ord(u'ẹ'): 'e',
ord(u'ê'): 'e', ord(u'ề'): 'e', ord(u'ế'): 'e', ord(u'ể'): 'e', ord(u'ễ'): 'e', ord(u'ệ'): 'e',
ord(u'ì'): 'i', ord(u'í'): 'i', ord(u'ỉ'): 'i', ord(u'ĩ'): 'i', ord(u'ị'): 'i',
ord(u'ư'): 'u', ord(u'ừ'): 'u', ord(u'ứ'): 'u', ord(u'ử'): 'ữ', ord(u'ữ'): 'u', ord(u'ự'): 'u',
ord(u'ý'): 'y', ord(u'ỳ'): 'y', ord(u'ỷ'): 'y', ord(u'ỹ'): 'y', ord(u'ỵ'): 'y',
}
slug = slugify(unicode(data).translate(vietnamese_map))
return slug
那么你应该在保存之前重写更改 slug 的保存方法。
注意:slug 字段已更改为 TextField。
def save(self, *args, **kwargs):
if not self.parent_category is None:
try:
parent_category = Category.objects.get(slug=self.parent_category)
parent_category.numberChild += 1
parent_category.save()
if self.slug == "":
self.slug = vi_slug(self.name)
else:
self.slug = vi_slug(self.slug)
except:
pass
super(Category, self).save()
希望这可以帮助您减少解决相同问题的时间。
我开始使用 Django 框架开发网站在线商店。我遇到了一个问题,我想将越南语 "những-viên-kẹo" 的名称更改为 "nhung-vien-keo"。我读过这篇文章: Django: Slug in Vietnamese
然后我在 model.py 上做了这样的事情:
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models
from django.template.defaultfilters import slugify
class Category(models.Model):
name = models.CharField(max_length=50)
slug = models.CharField(max_length=50, unique=True,help_text = 'Unique value for product page URL, created from name.')
description = models.TextField()
is_active = models.BooleanField(default=True)
meta_keywords = models.CharField("Meta Keywords", max_length=255, help_text='Comma-delimited set of SEO keywords for meta tag')
meta_description = models.CharField("Meta Description", max_length=255, help_text = 'Content for description meta tag')
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
db_table = 'categories'
ordering = ['-created_at']
verbose_name_plural = 'Categories'
def __unicode__ (self):
return self.name
@models.permalink
def get_absolute_url(self):
return ('catalog_category', (), { 'category_slug': self.slug })
但是当我在管理页面的名称字段中键入 "những-viên-kẹo" 时,slug 字段出现 "nhng-vien-ko"。我不知道有什么问题。 当我 运行 测试时:
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
vietnamese_map = {
ord(u'ư'): 'u',
ord(u'ơ'): 'o',
ord(u'á'): 'a',
ord(u'n'): 'n',
ord(u'h'): 'h',
ord(u'ữ'): 'u',
ord(u'n'): 'n',
ord(u'g'): 'g',
ord(u'v'): 'v',
ord(u'i'): 'i',
ord(u'ê'): 'e',
ord(u'n'): 'n',
ord(u'k'): 'k',
ord(u'ẹ'): 'e',
ord(u'o'): 'o',
}
print unicode("những-viên-kẹo").translate(vietnamese_map)
它工作正常,return "nhung-vien-keo"
[编辑]
我已经在 form.py
上试过了class CategoryAdminForm(forms.ModelForm):
class Meta:
model = Category
exclude = ()
def clean_slug(self):
slug = self.cleaned_data['slug']
vietnamese_map = {
ord(u'ư'): 'u',
ord(u'ơ'): 'o',
ord(u'á'): 'a',
ord(u'n'): 'n',
ord(u'h'): 'h',
ord(u'ữ'): 'u',
ord(u'n'): 'n',
ord(u'g'): 'g',
ord(u'v'): 'v',
ord(u'i'): 'i',
ord(u'ê'): 'e',
ord(u'n'): 'n',
ord(u'k'): 'k',
ord(u'ẹ'): 'e',
ord(u'o'): 'o',
}
slug = slugify(unicode(slug).translate(vietnamese_map))
return slug
并且在admin.py
class CategoryAdmin(admin.ModelAdmin):
form = CategoryAdminForm
# sets up values for how admin site lists categories
list_display = ('name', 'created_at', 'updated_at',)
list_display_links = ('name',)
list_per_page = 20
ordering = ['name']
search_fields = ['name', 'description', 'meta_keywords', 'meta_description']
exclude = ('created_at', 'updated_at',)
# sets up slug to be generated from category name
prepopulated_fields = {'slug': ('name',)}
admin.site.register(Category, CategoryAdmin)
但是还是不行!
我已经解决了这个问题。首先,我定义了一个包含键值对的映射。 Key 是 UTF-8 中的越南语字符。然后我用这个将一些特殊字符转换为相关的英文:
def vi_slug(data):
vietnamese_map = {
ord(u'o'): 'o', ord(u'ò'): 'o', ord(u'ó'): 'o', ord(u'ỏ'): 'o', ord(u'õ'): 'o', ord(u'ọ'): 'o',
ord(u'ơ'): 'o', ord(u'ờ'): 'o', ord(u'ớ'): 'o', ord(u'ở'): 'o', ord(u'ỡ'): 'o', ord(u'ợ'): 'o',
ord(u'ô'): 'o', ord(u'ồ'): 'o', ord(u'ố'): 'o', ord(u'ổ'): 'o', ord(u'ỗ'): 'o', ord(u'ộ'): 'o',
ord(u'à'): 'a', ord(u'á'): 'a', ord(u'á'): 'a', ord(u'ả'): 'a', ord(u'ã'): 'a', ord(u'ạ'): 'a',
ord(u'ă'): 'a', ord(u'ắ'): 'a', ord(u'ằ'): 'a', ord(u'ẳ'): 'a', ord(u'ẵ'): 'a', ord(u'ạ'): 'a',
ord(u'â'): 'a', ord(u'ầ'): 'a', ord(u'ấ'): 'a', ord(u'ậ'): 'a', ord(u'ẫ'): 'a', ord(u'ẩ'): 'a',
ord(u'đ'): 'd', ord(u'Đ'): 'd',
ord(u'è'): 'e', ord(u'é'): 'e', ord(u'ẻ'): 'e', ord(u'ẽ'): 'e', ord(u'ẹ'): 'e',
ord(u'ê'): 'e', ord(u'ề'): 'e', ord(u'ế'): 'e', ord(u'ể'): 'e', ord(u'ễ'): 'e', ord(u'ệ'): 'e',
ord(u'ì'): 'i', ord(u'í'): 'i', ord(u'ỉ'): 'i', ord(u'ĩ'): 'i', ord(u'ị'): 'i',
ord(u'ư'): 'u', ord(u'ừ'): 'u', ord(u'ứ'): 'u', ord(u'ử'): 'ữ', ord(u'ữ'): 'u', ord(u'ự'): 'u',
ord(u'ý'): 'y', ord(u'ỳ'): 'y', ord(u'ỷ'): 'y', ord(u'ỹ'): 'y', ord(u'ỵ'): 'y',
}
slug = slugify(unicode(data).translate(vietnamese_map))
return slug
那么你应该在保存之前重写更改 slug 的保存方法。 注意:slug 字段已更改为 TextField。
def save(self, *args, **kwargs):
if not self.parent_category is None:
try:
parent_category = Category.objects.get(slug=self.parent_category)
parent_category.numberChild += 1
parent_category.save()
if self.slug == "":
self.slug = vi_slug(self.name)
else:
self.slug = vi_slug(self.slug)
except:
pass
super(Category, self).save()
希望这可以帮助您减少解决相同问题的时间。