게시글 앱을 만들기 전에 게시글을 listing 해줄떄 핀터레스트를 따온 카드형 레이아웃을 구현할 방법으로 자바스크립트 라이브러리인 MagicGrid 를 살펴본다
articleapp 시작python manage.py startapp articleapp

pragmatic/settings.py articleapp 사용 명시...
INSTALLED_APPS = [
...
'articleapp', # 추기
]
pragmatic/urls.py 생성 articleapp 으로 향하는 Routing# pragmatic/urls.py
urlpatterns = [
path('admin/', admin.site.urls),
path('accounts/', include('accountapp.urls')),
path('profiles/', include('profileapp.urls')),
path('articles/', include('articleapp.urls')), # 추가
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
articleapp 에서 articleapp/urls.py 만들어주기
# articleapp/urls.py
from django.urls import path
from django.views.generic import TemplateView
urlpatterns = [
path('list/', TemplateView.as_view(template_name = 'articleapp/list.html'), name='list')
]
articleapp/templates/articleapp/list.htmllist.html 파일 생성

내부에 html, css 작성
내부에 자바 스크립트 작성

module.exports = MagicGrid; 코드 줄을 삭제하고let magicGrid = new MagicGrid({
container: '.container',
animate: true,
gutter: 30,
static: true,
useMin: true
});
magicGrid.listen();
{% load static %} 추가하고{% extends 'base.html' %}
{% load static %}
{% block content %}
<!--css-->
<style>
.container div {
width: 250px;
height: 500px;
background-color: antiquewhite;
display: flex;
justify-content: center;
align-items: center;
border-radius: 1rem;
}
</style>
<!--html-->
<div class="container">
<div class="item1">1</div>
<div class="item2">2</div>
<div class="item3">3</div>
<div class="item4">4</div>
<div class="item5">5</div>
<div class="item6">6</div>
<div class="item7">7</div>
<div class="item8">8</div>
<div class="item9">9</div>
<div class="item10">10</div>
<div class="item11">11</div>
<div class="item12">12</div>
<div class="item13">13</div>
</div>
<!--js-->
<script src="{% static 'js/magicgrid.js'%}"></script>
{% endblock %}

Lorem Picsum 사용하여 화면에 아이템 표시
https://picsum.photos/200/300 이 url 로 요청을 보내면
css 수정
<style>
...
/* width 제거 */
. container img {
width: 100% /* 부모의 크기를 다 채우도록 */
border-radius: 1rem; /* 둥글둥글하게 만들기 */
}
</style>
<div class="container">
<div class="item1">
<img src="https://picsum.photos/200/300" alt="">
</div>
...

자동적으로 레이아웃이 되지 않는다 %to% 사진이 로딩이 되는 시간이 존재하기 떄문이다
즉, 다음 자바스크립트 코드가 끝나고 그 뒤에 이미지 로딩이 완료되어서 실제로 Grid 를 배치시키는 것이 반영이 안됬기 떄문이다.

//static/js/magicgrid.js
...
let magicGrid = new MagicGrid({
container: '.container',
animate: true,
gutter: 30,
static: true,
useMin: true
});
//추가
var masonrys = document.getElementsByTagName("img")
for (let i=0; i<masonrys.length; i++){
masonrys[i].addEventListener('load', function () {
magicGrid.positionItems();
}, false);
}
magicGrid.listen();


