2016-10-16 9 views
1

私はDjangoフレームワークを使ってウェブサイトのオンラインストアを開発し始めます。私はベトナム語の "những-viên-kẹo"の名前を "nhung-vien-keo"に変更したいという問題に直面しています。私はこの記事を読んでいる: Django: Slug in VietnameseDjango:ベトナムのスラッグが正しく動作しません

をし、私はこのような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・ビエン・ケオ」と入力すると、スラッグフィールドは「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・ビエン・ケオ" を返す

[EDIT]

私は私の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) 

しかし、まだ動作しません!

答えて

1

私は私の問題を解決しました。最初は、ペアになったキー値を含むマップを定義します。 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

:それから私は英語で関連するいくつかの特殊文字を変換するために、これを使用します。 注:スラッグフィールドは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()

これはあなたが少なく、同じ問題を解決するための時間をcomsuming役立つことを願って。

関連する問題