×

TODAY   21    TOTAL   2429   

 

Orca the Whale

Django Custom Filter를 만들어보자. Django

조회수 : 65

작성일 : 2019-01-22 22:09

django python

1. 개요

댓글을 작성하는데, 이름을 쓰는 게 너무 귀찮았다.


유일한 회원이라는 특권을 누리고 있는데 이런 번거로움은 말이 안 된다 !

그래서 로그인 되어있는 상태에서는 자동으로 이름이 입력되어 있도록 수정하기로 했다.



2. Template Variable


{% if user.is_authenticated %} // 로그인 된 경우
    console.log('{{user}}') // 사용자 아이디
    console.log('{{user.id}}') // 사용자 pk
    console.log('{{user.first_name}}') // 사용자 이름
{% endif %}

로그인 되어 있는 경우, 로그인 된 유저의 이름을 먼저  console에 출력해봤다.



세상에 이런 일이!

콘솔에 사용자 이름이 출력되지 않았다!

이게 어떻게 된 일일까? 

스택오버플로우에선 get_first_name이라는 필터를 사용하라고 했다.

하지만 똑같이 아무것도 출력이 되지 않았다.



3. Custom Template Filter

혹시 get_first_name 필터가 구 버전에서만 작동하나? 라는 생각이 들었고, 한번 직접 구현해보기로 했다.

앱 디렉토리 바로 아래에 templatetags라는 디렉토리를 생성한다.

templatetags 디렉토리 밑에 필터를 작성할 파이썬 파일과 __init__.py 파일을 생성한다.

__init__.py 파일이 있어야 정상적인 파이썬 패키지 역할을 할 수 있다.

blog/
    __init__.py
    models.py
    templatetags/
        __init__.py
        blog_extras.py
    views.py

디렉토리 상황을 트리화 하면 위와 같다.


이제 blog_extras.py 파일에 필터를 작성해보자.

먼저 유효한 템플릿 필터로 사용하기 위해선 모듈이 register라는 이름의 template.Library라는 인스턴스를 포함해야 한다. 

from django import template
register = template.Library()

이제 사용자의 이름을 반환하는 필터를 작성해보겠다.

def get_full_name(value):
    return value.last_name + value.first_name

이 함수를 @register.filter 데코레이터로 감싸면 필터가 등록된다!



4. 템플릿에 import

템플릿에서 필터를 사용하기 위해선 먼저 blog_extras.py 파일이 속한 앱이 settings.pyINSTALLED_APPS에 선언되어 있어야 한다. 

필터를 사용할 템플릿에서 {% load blog_extras %} 로 모듈을 import하고 사용하면 된다!

{% if user.is_authenticated %}
    console.log('{{user}}')
    console.log('{{user.id}}')
    console.log('{{user|get_full_name}}') // this one !
{% endif %}

그런데

.

.

.

똑같이 공백이 출력됐다. 왜일까?



5. 신중함


그 이유는 애초에 이름이 저장이 안 되어 있기 때문이었다!

저장하고 나니 {{user.first_name}}도 정상적으로 작동했다!

그래도 필터를 직접 만들어 본 것에 의의를 두었다고 치자.


There are 7 comments.

윤여환 이메일도 자동으로 채워주나요?   128.134. * . * 2019-01-22 22:44 답글 삭제
황준필 그렇습니다. 일반 사용자들의 회원가입, 로그인 기능도 구현할 계획입니다.    2019-01-23 09:16 삭제
김의 기준? 와!! 여환!! 여환??? 이환??? 이환은 유튜브 삭제해라~~~~    106.255. * . * 2019-01-23 09:27 삭제
뤈랑호 많은 도움이 됐습니다   59.10. * . * 2019-01-23 11:13 답글 삭제
황준필 감사합니다^    2019-01-24 09:01 삭제
dd 회원가입 기능 만들 계획은 없나요?    106.245. * . * 2019-01-23 14:57 답글 삭제
황준필 1월 말에서 2월 초 사이에 만들 생각입니다    2019-01-23 17:44 삭제
  • 윤여환 답글 삭제 이메일도 자동으로 채워주나요? 2019-01-22 22:44 | 128.134. * . *
  • 황준필 삭제 그렇습니다. 일반 사용자들의 회원가입, 로그인 기능도 구현할 계획입니다. 2019-01-23 09:16 | 
  • 김의 기준? 삭제 와!! 여환!! 여환??? 이환??? 이환은 유튜브 삭제해라~~~~ 2019-01-23 09:27 | 106.255. * . *
  • 뤈랑호 답글 삭제 많은 도움이 됐습니다 2019-01-23 11:13 | 59.10. * . *
  • 황준필 삭제 감사합니다^ 2019-01-24 09:01 | 
  • dd 답글 삭제 회원가입 기능 만들 계획은 없나요? 2019-01-23 14:57 | 106.245. * . *
  • 황준필 삭제 1월 말에서 2월 초 사이에 만들 생각입니다 2019-01-23 17:44 |