ks.dgoon.lee log

글 제목 뒤에 첨부파일(이미지?) 개수 보이게 하기


2023/10/14 02:36:26 #django #summernote #dev #media #attachment
Attachments:

보통 커뮤니티들 보면 글 제목 뒤에 첨부파일 여부나 댓글 개수를 보여주곤 한다.

예를 들어 이런 식. (from theqoo)

이 블로그에는 아직 댓글 기능이 없으니, 첨부파일 여부를 보여줘야지 하고 뚝딱뚝딱 시작했는데 어머나! django summernote 가 기본적으로 만드는 db 구조에는 attachment 의 name, path, url, uploaded_at 만 있고 연관된 글에 대한 참조가 전혀 없다. 단적으로 일단 업로드해서 media url 생성된 후라면 django_summernote_attachment 테이블의 데이터는 없어도 별 상관이 없다. 이 테이블은 왜 만드는걸까?

django summernote 가 이미지 첨부를 하는 방식을 보면, 글 작성중에 이미지를 업로드할때 django_summernote_attachment 테이블에 엔트리를 바로 만들고, media url 로 서빙할 수 있게 준비한다. 그렇게 해놓고 url 을 에디터에 슥 삽입하는 방식이다. 아직 글 작성이 완료된게 아니기 때문에 이 시점에 Post 와 attachment 를 연결할 수가 없다. 그래서 글 작성을 마무리하고 저장을 할때 뭔가 하는게 있나 봤더니, 전혀 없다. 전혀 없다는 뜻은, 저장하는 글과 첨부파일을 연결하지도 않고, 글을 저장하지 않고 그냥 버리더라도 작성중에 저장된 이미지를 지우지도 않는다는 것. 더 복장 터지는 것은, 첨부파일이 어디 연결되었는지 저장하지 않기 때문에 "이 첨부파일이 참조하는 글이 있는지 없는지도 모른다" 는 것이다. 서버에 쓰레기 이미지가 마구 쌓여가도 이게 사용하는건지 아닌건지 알 수가 없기 때문에 주기적으로 필요없는 이미지를 삭제할 수도 없다...

이 답답한 상태를 그대로 놓고 publish 해두기에는 너무 찝찝하여 약간 손을 댔다.

1. django_summernote.models.Attachment 를 상속받아서

    a. post = models.ForeignKey( ...) 로 연결. nullable, blankable, on_delete 는 SET_NULL. CASCADE 같이 위험한건 쓰지 말자 제발.

    b. md5digest 를 추가. 용량을 아끼려면 16bytes 로 잡아도 되지만, select 할때 깨지는건 싫으니까 그냥 32bytes 잡고 hexdigest 를 쓴다.

2. settings 를 찾아서 SUMMERNOTE_CONFIG 에 'attachment_model' 에 방금 만든 클래스를 넣는다

3. 앱 안에 signals.py 를 만들고, pre_attachment_save, post_post_save, pre_post_save 들을 만든다.

    a. pre_post_save: instance.id 가 있다면(이미 있는 post 를 수정하는 것) attachments.clear()

    b. post_post_save: 여기서 고민을 많이 했는데... 일단 연결된 Post 가 없는 attachment entry 를 모두 가져와서, instance.content 안에 attachment.file.url 이 있는지 본다. 있으면 instance.attachments.add 로 추가. Post:Attachment 는 1:N 관계이기 때문에 이미 연결된 Post 가 있는 attachment 는 안봐도 되니까! 어설프지만 더 좋은 방법은 차차 고민해서 고쳐보기로 하자.

    c. pre_attachment 에서는 업로드하는 파일의 md5digest 를 만들어서 instance.md5digest 에 넣는다.

4. apps.py 에서 AppConfig 안에 ready 함수 추가. 함수 내용은 딱 한줄이다. "from . import signal"

5. makemigrations, migrate

6. template 에서 {{post.attachments.count}}{%forattachmentinpost.attachments.all%}이런 식으로 attachments 를 쓸 수 있다.

사실 md5digest 는 지금 필요한건 아니다. 나중에 써볼려고 미리 넣어본거고... pre_post_save, post_post_save 가 중요하다. 이걸 하고 나면 아래같이 화면을 그릴 수 있다. 첨부파일 개수가 댓글 개수같아 보이지만, 그건 나중에 댓글기능 붙이면 바꿔보기로 하자.





댓글 1개

2023/10/16 23:27:28 dgoon
cdn 마이그레이션 후에 기존 업로드 엔트리에 문제가 생겼지만... 귀찮으니 그냥 두자.
⤷ 댓글을 작성해 주세요. 비밀번호는 나중에 댓글을 수정하거나 삭제할 때 필요합니다.