[Python #12] [Django #5] Template tags, filters 사용하기

pixabay

스팀 목록을 웹페이지에 뿌리면서 한 가지 난관에 봉착했다. 포스팅 썸네일을 그려줘야 하는데 get_blog() 함수에는 썸네일 관련 파리미터가 존재하지 않는다. get_blog 함수를 좀 더 파봤다. 👇

[{'blog': 'steem.scot',
  'comment': {'active_votes': [],
              'author': 'steem.scot',
              'author_reputation': 0,
              'beneficiaries': [],
              'body': '|table|테이블|表格|\n'
                      '|---|----|---|\n'
                      '|table cell|테이블 셀|表格内容|\n'
                      'pixabay\n'
                      'https://cdn.pixabay.com/photo/2015/06/02/12/59/narrative-794978_1280.jpg\n'
                      '\n'
                      'CONTENT, content 내용입니다. 本文测试。\n'
                      '\n'
                      '\n'
                      '![stained-glass-1181864_1280.jpg](https://cdn.steemitimages.com/DQmSvFnsanUa6uxLS3qzTkiTBj7HK5oYs3hGhZySGCW9iUS/stained-glass-1181864_1280.jpg)\n'
                      '\n'
                      '\n'
                      '> 인용문',
              'body_length': 319,
              'cashout_time': '2020-08-30T05:46:54',
              'category': 'qa',
              'children': 0,
              'created': '2020-08-23T05:46:54',
              'curator_payout_value': '0.000 SBD',
              'depth': 0,
              'json_metadata': '{"tags":["qa","test1","korea","china"],"image":["https:\\/\\/cdn.pixabay.com\\/photo\\/2015\\/06\\/02\\/12\\/59\\/narrative-794978_1280.jpg","https:\\/\\/cdn.steemitimages.com\\/DQmSvFnsanUa6uxLS3qzTkiTBj7HK5oYs3hGhZySGCW9iUS\\/stained-glass-1181864_1280.jpg"],"app":"steemit\\/0.2","format":"markdown"}',
              'last_payout': '1969-12-31T23:59:59',
              'last_update': '2020-08-23T05:46:54',
              'max_accepted_payout': '1000000.000 SBD',
              'net_rshares': 0,
              'parent_author': '',
              'parent_permlink': 'qa',
              'pending_payout_value': '0.000 SBD',
              'percent_steem_dollars': 10000,
              'permlink': 'test-1',
              'post_id': 87205021,
              'promoted': '0.000 SBD',
              'replies': [],
              'root_title': '[Test #1] 测试 한글',
              'title': '[Test #1] 测试 한글',
              'total_payout_value': '0.000 SBD',
              'url': '/qa/@steem.scot/test-1'},
  'entry_id': 0,
  'reblogged_on': '1970-01-01T00:00:00'}]

두 가지 방법이 있다. body 값에서 이미지 URL을 추출하는 방법과, 'json_metadata'값에서 image파라미터를 추출하는 방법이다. 전자는 정규식을 동원해야 할 것 같은데 나는 잘 사용하지 못한다. 두 번째 방법은 'json_metadata'값이 json 포맷이기 때문에 image파라미터를 추출하는 방법은 간단하다. 다만 json 포맷은 맞으나 String 타입인데 이것만 dict으로 바꿔주면 쉽게 해결될 것 같다.

그럼 어느 위치에서 String to dict을 할 것인가? get_blog() 메서드가 위치한 views.py에서? 아니면 html파일에서? 전자는 꽤 복잡할 거 같다. 데이터를 불러온 후 for문을 돌리면서 image 값을 추출해야 하고 이렇게 추출한 값을 또다시 저장하여 마지막에 또 불러와야 하는데... 왠지 불필요한 반복문이 될 것 같고, 수정해야 하는 부분도 한두 가지가 아닐 것 같다. 가급적이면 반복문을 안 쓰고 싶고 어차피 마지막에 html에 랜더링 할 때 반복문이 또 한 번 들어간다. 이때의 반복문을 이용해 image 값을 추출해서 뿌려주면 더 쉬울 것 같아 인터넷에서 찾아본다. 왠지 django가 기능을 제공할 것 같았고, 실제로도 그러했다.

jdango의 템플릿 필터를 사용하면 될 것 같다.
템플릿 필터를 사용하기 위해서는 app 디렉토리 하위에 templatetags라는 폴더를 필수로 생성해야 하고, 그 하위에 init.py 파일도 필수로 생성해야 한다고 한다. 또한 별도의 파일을 생성하여 django의 룰에 맞게 필요한 함수를 작성하면 된다. 나한테는 str_to_dict이 되겠다. 👇

from django import template
import json

register = template.Library()


@register.filter
def str_to_dict(string):
    return json.loads(string)

html 파일에서는 위에서 만든 템플릿을 불러오는 {% load post_extras %}를 입력하고, 썸네일을 뿌려야 하는 위치에서 str_to_dict 함수를 호출해서 사용한다. 문법이 좀 특이해서 적응하는 데 시간이 걸릴 듯하다. {% with post.comment.json_metadata|str_to_dict as extras %}식으로 str_to_dict 함수를 호출하고 여기서 | 좌측 부분이 인자가 되며 extras라는 변수에 할당된다. 다음 Img 태그의 src 속성에 image 의 첫 번째 인덱스를 호출한다. src="{{ extras.image.0 }}"

실행해 보니 다행히 썸네일이 잘 내려온다. 다만, 극 소수의 썸네일이 보이지 않는데... appics로 쓴 글들은 json_metadata에 값이 없는 것으로 보인다. 일단 appics로 등록한 글이 많지 않으니 known-issue로 넘어간다. 👇

이 글을 쓰면서 발견했는데 7일 지난 글 보상이 다 0으로 노출된다. 도대체가 한 번에 되는 게 없다.
뭐 이것도 템플릿 필터로 해결 가능할 것 같다. 이건 나중에 해보자.

.
.
.
.
[Cookie 😅]
Python 3.7.4
Django 2.2.4
steem-python 1.0.1
goorm IDE 1.3

참고 글:
https://wayhome25.github.io/django/2017/06/22/custom-template-filter/

https://www.pymoon.com/entry/djang-%ED%85%9C%ED%94%8C%EB%A6%BF%EC%97%90%EC%84%9C-custom-tag-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0

https://amoreopensource.wordpress.com/2019/04/23/access-jsonfield-in-django-templates-like-a-dictionary/

Sort:  

[US$18.50](▼39%)[Xiaomi]🚨2020 최신 항바이러스 필터 입고!!🚨 샤오미 공기청정기 필터 / 미에어 필터 / 고효율 정화 / 활성탄 필터 / 포름알데히드 제거 / 고밀도 헤파필터 / 무료배송

WWW.QOO10.COM

@june0620 transfered 1.0 KRWP to @krwp.burn. voting percent : 0.74%, voting power : 79.10%, steem power : 1889963.34, STU KRW : 1200.
@june0620 staking status : 60 KRWP
@june0620 limit for KRWP voting service : 0.12 KRWP (rate : 0.002)
What you sent : 1.0 KRWP
Refund balance : 0.88 KRWP [46236586 - 2e198f03c099bc79ea6cef51cc93ba600874e961]

Coin Marketplace

STEEM 0.15
TRX 0.03
JST 0.025
BTC 12156.53
ETH 378.09
USDT 1.00
SBD 0.99