2025/11/16 Django - 9

김기훈·2025년 11월 16일

TIL

목록 보기
57/191

오늘 학습 내용

post 기능 구현하기

  • post app 생성 및 settings에 등록

필요한 기능

  • 이미지 여러개(FK) / 글 / 작성자 / 작성일자 / 수정일자

Post Model

  • 작성일자, 수정일자는 공통적으로 사용될 필드
    • TimestampModel (추상기반 클래스)로 생성하여 활용 (utils/models.py)
  • image = models.ImageField
    • 이미지를 한장만 넣을 경우 사용 가능
  • def str(self):
    • 필수 X , admin페이지에서 편하게 보기위해 사용함

  • 미디어 경로 변경하기

    • settings.py 에 MEDIA_URL 추가 및 urls.py에서 연결
  • Django - 8 에서 적어놨던 TODO 해결


Post 목록 페이지 만들기

  • 디자인 조금 pt -3

  • related_name = images를 상용하여 url을 줄인다

    • class = "img_fluid" : 이미지의 크기가 최대를 넘지 않게 함
  • lg 가 붙은건 큰 화면일때의 크기

Swiper.js

  • Swiper
    • 현대적이고 강력한 이미지 캐러셀 라이브러리, 다양한 옵션과 기능을 제공하며 반응형 디자인을 지원
  • swiper-pagination
    • 슬라이더 하단에 페이지네이션을 표시하여 사용자가 현재 슬라이드의 위치를 확인할 수 있게 함
  • 사용자에게 포스트 별로 업로드된 이미지들을 슬라이드 형태로 보여줄 수 있음
    • Swiper.js
      • 매우 유연하고 다양한 커스터마이징 옵션을 제공
      • 필요에 따라 슬라이더의 동작 방식이나 스타일을 조정할 수 있음

1

  • 양 옆으로 슬라이드 가능

  • 이미지 크기 변경 및 무한슬라이드 끄기

  • BootStrap Docs

  • <meta name="viewport" content="width=device-width, initial-scale=1">

    • 모바일로 들어온 화면 개선?

2 font awesome

  • linebreaksbr : 내용 줄넘김 기능 추가

  • Post.objects.all().select_related('user').prefetch_related('images')
    • DB 부하를 줄이기 위하여 select_related / prefetch_related 사용
      • select_related
        • Post 가 ForeignKey를 가지고 있으면 사용 가능
          • JOIN
      • prefetch_related(역참조)
        • PostImage 가 ForeignKey로 Post를 가지고 있을때 사용
        • ManyToMany 일때 사용
          • 연관되어 있는거 가져옴

전체적인 구조

  • for 루프를 사용해 각각의 Post 객체와 해당 포스트에 연결된 PostImage 객체들을 렌더링
    • 이를 통해 여러 개의 이미지가 슬라이더로 표시
  • 이미지 슬라이드 하단에 페이지 번호 또는 도트(dots) 형식의 페이지네이션이 표시

Post 목록 무한 스크롤 만들기

Waypoints 라이브러리

  • 스크롤 위치를 감지하여 특정 이벤트를 발생시키는 기능을 제공
    • 무한 스크롤을 구현하는 데 유용하게 사용 가능

  • list.html 에 {% load static %} 추가하고 시작

  • post가 가지고 있는 image를 가져와서 post를 새로 만들고 가져온 이미지를 돌면서

    • 새로운 포스트를 만들어줌

jquery

  • JavaScript 를 좀더 간단하게 사용할 수 있게 해주는 패키지 ('$')

  • 다운로드 눌렀을때 나오는거 전체 복사

    • 현재 프로젝트의 static/js/jquery.min.js 파일에 복사한 내용 붙여넣기


포스트 생성, 수정 페이지 만들기

jquery.formset

  • Django와 함께 사용할 수 있는 JavaScript 라이브러리
    • Django의 폼셋(Formset) 기능을 클라이언트 측에서 동적으로 추가하거나 삭제하는 기능을 제공
      • 폼셋(Formset)
        • 같은 형태의 여러 폼을 하나의 폼 그룹으로 관리할 수 있는 Django의 기능
    • jquery.formset은 이를 더욱 사용자 친화적으로 만들어 주는 도구

jqery.formset.js 파일 / jquery.formset.min.js


create

  • 오류발생
    • 해결: form_class=PostForm 추가

디자인 다듬기

  • utils/forms.py 생성
    • create의 본문 칸 줄이기 및 마우스로 본문 칸 조절 불가능 하게 설정
    • 사이즈 수정

1 (query.formset 적용)

  • static/js/jquery.formset.js 에 위의 파일 복사 붙여넣기
    • extra: 기본적으로 추가할 자식 폼의 수를 설정
    • can_delete: 자식 폼의 삭제 여부를 설정

2

  • 이미지 파일 추가하는 기능 추가

  • form_valid 수정

  • prefix = images 인 이유


Update

  • 생성 버튼 만들기

inlineformset_factory

  • Django에서 모델의 폼셋을 생성하는 유용한 도구
    • 부모 모델과 자식 모델 간의 관계를 다루는 폼셋을 자동으로 생성 가능
      • 주로 부모 모델과 관련된 여러 자식 모델 인스턴스를 한 번에 편리하게 관리할 때 사용
      • 주로 부모 모델과 자식 모델 간의 ForeignKey 관계를 관리하는 데 사용
    • 부모 모델의 인스턴스를 편집할 때 자식 모델의 인스턴스도 함께 관리할 수 있는 폼셋을 자동으로 생성

formset.management_form

  • Django의 폼셋(Formset)을 처리할 때 중요한 역할을 하는 관리 폼(Management Form)
    • 이 관리 폼은 폼셋의 여러 폼을 관리하고, 폼셋의 상태를 유지하는 데 필요한 정보를 제공

역할과 중요성

    1. 폼셋 상태 관리
    • 관리 폼은 폼셋의 상태를 관리하기 위해 사용
    • 이상태 정보에는 폼셋의 총 폼 수, 현재 폼 수, 추가된 폼의 수 등
      • 폼셋이 제대로 작동하는 데 필요한 메타 정보가 포함
    1. 폼셋 내 폼 수 조정
    • 관리 폼은 폼셋의 extra 폼 수(즉, 기본적으로 추가할 폼 수)와
      • 삭제된 폼 수를 서버로 전송하는 데 사용, 이는 폼셋의 각 폼이 제대로 처리되도록 함
    1. 폼셋 데이터 처리
    • 관리 폼은 폼셋 데이터와 관련된 정보(예: 폼의 순서, 삭제 플래그 등)를
      • Django가 올바르게 처리할 수 있도록 돕는다.

댓글 모델 만들기, 태그 모델 만들기

  • 태그 : N:N 구조


새롭게 알게된 내용

  • class PostForm(forms.ModelForm):
    • from django import forms 필요
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
  • super.init(*args, **kwargs): 오류 발생
  • super().init(*args, **kwargs) : 이게 맞는 표현

  • 특정 마이그레이션 파일 적용하기
# 현재 마이그레이션 된 파일 확인
>> python manage.py showmigrations

# 특정 마이그레이션 적용
# 이후 미적용 대상인 마이그레이션 파일 삭제
>> python manage.py migrate post 0001

# 다시 가장 최신의 마이그레이션 파일 만들기
>> python manage.py makemigrations

# 마이그레이트
>> python manage.py migrate

# 0번 마이그레이션 파일로 돌리고 싶을 때
>> python manage.py migrate post zero

어려운 내용(추가 학습 필요)

오늘 발생한 문제(발생 했다면)

profile
안녕하세요.

0개의 댓글