장고(Django) 사용자이름 표기(get_full_name) :: 2010/02/12 15:48

매우 간단한 것이지만, 요즘 블로그도 넘 뜸하고, 자꾸 써봐야 할것도 같고 해서 포스팅.

기본장착된 장고(Django) 사용자모델 Django.contrib.auth 의 get_full_name 메쏘드는 사용자의 이름(first_name) 과 성(last_name) 을 공백으로 연결한 결과를 돌려준다. 해서, "Hyungyong Kim" 처럼 결과를 볼 수 있다. (난 영문이름은 이렇게 써야한다고 본다. 영어식 이름표기의 개선이 필요한 이유 참고)

문제는 한글로 성과 이름을 등록한 회원인 경우인데, 성이 "이" 이고 이름이 "개똥" 이면, "개똥 이" 라고 표기되고 이것이 보기 좀 머시기 하다.

이런 경우 가장 깔끔한 방법은 이름을 한글로 적었는가를 직접 확인하고 바꿔주는 것이 좋다. (request.LANGUAGE 이런걸 확인해봐야 도움이 안된다.)

import re
from django.contrib.auth.models import User

class MyUser(User):
    class Meta:
        proxy = True
    def get_full_name(self):
        is_english = re.match(r'^\w', self.first_name)
        if not is_english:
            return "%s%s" % (self.last_name, self.first_name)
        return super(MyUser, self).get_full_name()

저렇게 놓고 이름목록을 출력하면 보기 좋긴하나 first_name 으로 정렬한 경우, "성"이 아닌 "이름"으로 정렬되기 때문에 정렬안한것 처럼 보인다. (모 아이폰 어플의 연락처도 비슷한 문제가 있던 듯.) 그렇다고 last_name 으로 정렬하면 또 영문등록된 이름이 정렬 안한것 처럼 보인다.

그렇다면 정렬도 나눠서 따로 하고 다시 합치는 방식을 쓰면 된다.

class MyUserManager(models.Manager):
    def order_by_name(self):
        query = Q(first_name__regex=r'^\w')
        return MyUser.objects.filter(query).order_by('first_name') \
                | MyUser.objects.exclude(query).order_by('last_name')

위 manager를 붙여서 쓰면 쿼리셋으로 계속 사용할 수 있다는 장점까지.

Trackback Address :: http://yong27.biohackers.net/trackback/364
Name
Password
Homepage
Secret