조회수 : 799
작성일 : 2019-01-22 22:09
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.py
에 INSTALLED_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}}
도 정상적으로 작동했다!
그래도 필터를 직접 만들어 본 것에 의의를 두었다고 치자.
![]() |
삭제된 댓글입니다. 106.255. * . * | 2019-01-23 09:27 |
- 윤여환 답글 삭제 이메일도 자동으로 채워주나요? 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 |