Django: 커스텀 탬플릿 태그
Django: 커스텀 탬플릿 태그

Django: 커스텀 탬플릿 태그

Published
February 9, 2023
Author
WonJung Kim
오늘 개발한 내용들 중 다시 쓸만한 것이나 참조할때 쓸만한 것들을 대충 정리했다.

Tag

Show Debug Data

from django.conf import settings from django import template register = template.Library() @register.simple_tag def show_debug_data(): return settings.DEBUG and settings.SHOW_DEBUG_DATA
초기 개발시, 임시로 만들어둔 폼 등에서 쓰는 태그
기존에는 debug로 했는데 잠시 외부 도움을 받을려고 Try Cloudflare 서비스를 이용했는데, 그대로 디버그 데이터가 노출되어 버린것이다. 이유는 Reverse Proxy 이기 때문에 Internal IP가 같아서 생긴 내용. 일단은 이렇게 하고 settings.pySHOW_DEBUG_DATA = False 라인을 추가했다. 외부에서 도움을 받을때만 끄면 되니까.

Filter

render_image_tag

from django import template import re register = template.Library() @register.filter def render_image_tag(value, _args = ""): if '|' in _args and '=' in _args: args = {k: v for k, v in [i.split('=') for i in _args.split('|')]} else: args = {'src': _args} additional = [] src = args.get('src', '') inline_style = args.get('style', None) inline_class = args.get('class', None) print(args) match src: case '[static]': path = '/static/' case _: path = src if inline_class: additional.append(f'class="{inline_class}"') if inline_style: additional.append(f'style="{inline_style}"') return re.sub(r"\[image\s+[\"'](.+?)[\"']\]", fr'<img src="{path}\1" {" ".join(additional)} />', value)
Text에서 image를 랜더링 할때 사용하는 filter: [image 'text.jpg'] 식으로 사용한다.
이미지를 글 중간에 표시해야했다. 그런데 아뿔사! 이미지 관련 필드를 넣지못했다! 임시로 정규식을 사용하여 해결을 봤다.
 
{% with text=post.description|render_image_tag:'src=[static]|style=width:100%;'|safe %}
사용 예
사실 완벽한 방법이 아니기도 하고, 여러 이슈가 있다. 그래도 없는것 보단 낫다. 다음에는 못해도 마크다운을 쓰도록 설계해야겠다.
 

splitter

from django import template register = template.Library() @register.filter def splitter(value, _arg): match _arg: case '[newline]': arg = '\n' case _: arg = ' ' l = value.split(arg) return [i.strip() for i in l]
받은 텍스트를 split 할때 사용
이것도 임시다. split 을 하여 새로운 라인을 만들때 필요했다. 일반적인 TextField를 사용했기에 발생했다. 새로운 라인이 깨졌기에 각각 나눠서 탬플릿 내에서 for문을 돌릴때 사용했다. 심지어 '\n' 으로 넘길시에 작동이 제대로 안되어 추가적으로 match-case 문을 만들어 넣었다.
다음부터는 마크다운으로 렌더링 해야겠다는 생각만 들었다.
{% for line in post.description|render_image_tag:'[static]'|spliter:'[newline]' %} <p style="margin-top: 10px; text-align: left;">{{ line|safe }}</p> {% endfor %}
사용 예

시간이 부족하면, 땜빵을 하고, 이게 10년을 간다. 조심해야겠다.