2016-10-16 3 views
1

Я начинаю разрабатывать интернет-магазин на сайте с использованием рамки Django. Я столкнулся с проблемой, что хочу изменить имя на вьетнамском «những-viên-kẹo» на «nhung-vien-keo». Я прочитал эту статью: Django: Slug in VietnameseDjango: 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 }) 

Но когда я типа «Нхунг-Вьен-Кео» в поле Имя страницы админки, поле слива появляется «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) 

Она работает правильно, и вернуть "Нхунг-Вьен-КЕО"

[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

У меня есть решение проблемы. Сначала я определяю карту, содержащую значение ключа в паре. Ключ является символом вьетнамского языка в 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 времени для решения той же задачи.

Смежные вопросы