読者です 読者をやめる 読者になる 読者になる

Djangoroidの奮闘記

python,django,angularJS1~三十路過ぎたプログラマーの奮闘記

Django Python 漢字・ひらがな・カタカナをローマ字に変換する~pykakasi

概要

django で、漢字・ひらがな・カタカナをローマ字に変換して、slugなどに利用したい!

参照サイト

qiita.com

pypi.python.org

利用方法

pip install する

pip install pykakasiだと失敗するので、githubソースコードを直接installする。 requirementsにも同様に記載するのを忘れない。

$ pip install git+https://github.com/miurahr/pykakasi

pykakasiをpython shellで試してみる。

  from pykakasi import kakasi
  kakasi = kakasi()
  kakasi.setMode('H', 'a')
  kakasi.setMode('K', 'a')
  kakasi.setMode('J', 'a')
  conv = kakasi.getConverter()
  conv.do('利用方法がわかるkkk')
'riyouhouhougawakarukkk'

という感じで設定できる。

公式の設定方法はこちら

import pykakasi.kakasi as kakasi 

kakasi = kakasi() 
kakasi.setMode("H","a") # default: Hiragana no convert 
kakasi.setMode("K","a") # default: Katakana no convert 
kakasi.setMode("J","a") # default: Japanese no convert 
kakasi.setMode("E","a") # default: Symbols no convert 
kakasi.setMode("r","Hepburn") # default: use Hepburn Roman table 
kakasi.setMode("s", True) # separate, default: no Separator 
kakasi.setMode("C", True) # capitalize default: no Capitalize 
conv = kakasi.getConverter() 
result = conv.do(text) 

djangoに記載してみる ~ create slug編

prea_saveして、slugがないときに、slugを作成するfunction titleをconv.doして、全てローマ字に変換している。

def create_slug(instance, new_slug=None):
    title = instance.title
    r_title = conv.do(title)
    slug = slugify(r_title)
    if new_slug is not None:
        slug = new_slug
    qs = Classname.objects.filter(slug=slug)
    exists = qs.exists()
    if exists:
        new_slug = "%s-%s" %(slug, qs.first().id)
        return create_slug(instance, new_slug=new_slug)
    return slug

def classname_pre_save_reciever(sender, instance, *args, **kwargs):
    if not instance.slug:
        instance.slug = create_slug(instance)

無事処理できた!次はアップロードされたfilenameで試してみる。

djangoに記載してみる ~ uploadimage編

filenameを、basenameと、file_extensionの部分に分ける。 basenameの部分をkakasiで処理してみる。

def image_upload(instance, filename):
    slug = instance.slug
    basename, file_extension = filename.split(".")
    basename = conv.do(basename)
    filename = basename + "." + file_extension
    return "/images/%s/%s" %(slug, filename)

無事処理完了!