簡體   English   中英

Django:越南人的子彈無法正常工作

[英]Django: Slug in Vietnamese working not correctly

我開始使用Django框架開發網站在線商店。 我遇到了想要將越南語“những-viên-kẹo”的名稱更改為“ nhung-vien-keo”的問題。 我讀過這篇文章: Django:越南文中的Slug

我在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”時,子彈字段顯示為“ 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)

它可以正常工作,並返回“ 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)

但這仍然行不通!

我已經解決了這個問題。 首先,我定義一個包含成對鍵值的映射。 密鑰是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 

然后,應在保存之前重寫save方法以更改塊。 注意:子彈字段已更改為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() 

希望這可以幫助您減少解決相同問題的時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM