728x90
반응형
오늘 한 일
- DRF 1주차 수강
- 프로젝트 때 마무리 못한 기능 구현
- 팀원들과 코드 리뷰
마무리 못한 기능 구현
- 구현하려던 기능 : 태그 두 개 이상으로 검색 가능
- 문제 : 검색은 되나 페이지네이션이 겹침
- 문제 이유 : 페이지를 담은 변수 두 개가 동시에 넘어감
- 시도 : 내가 원하는 건 두 개 이상의 태그에 대한 게시글들이 한꺼번에 나오고 페이지네이션이 하나만 나오는 거였는데, 변수 두 개 넘어가는 걸 도저히 못 쪼개겠어서 태그별로 따로 하게 하려고 했는데 자꾸 페이지 뜨는 쪽이 겹쳤고, 프론트 쪽에서 잘 조절하니 분리되긴 했는데 페이지가 따로따로 움직여야 하는데 위에만 2페이지로 넘어가도 밑에 것도 같이 2페이지로 넘어가는 문제 발생. 문제 이유 자체는 알고 있었기에 백엔드 쪽에서 어떻게든 변수를 두 개로 쪼개보려고 range 함수도 써보고, filter함수도 써보고 이중 for문을 썼다가 도무지 안 돼서 프론트 쪽에서 for문 위치도 바꿔보고 별 짓을 다했다.
- 해결 아이디어
- “페이지네이션 하기 전에 데이터를 넘겨보세요.”
- “그냥 저 게시글을 한꺼번에 넘기면 안 돼요?”
- “프론트 쪽에 for문이 두 개가 있으면 안 될 거 같은데요.”
- 등등 뭔가 한번씩 생각해본 것들이라 건방지게도 “해봤는데 되지 않았다”라는 되도 않는 생각을 했는데 저 문제들 중 하나만 파고든 게 문제였다. 결정적으로 의문스럽던 첫 번째 말이 두 번째 말을 듣고 뭔가 엇 애초에 처음 원하던대로 한 개로 합쳐지는 형태로 만들고 싶었다면 난 왜 결과물을 두 개로 쪼갰지? 라는 생각이 들면서 이해돼서 해결하게 됐다.
- 해결 : 페이지네이션 하기 전에 개수만큼 쪼갠 검색어에 따른 결과물을 하나로 모았다. 이때 append로 리스트에 추가하면 리스트 모양 그대로 추가되기 때문에 어차피 또 한개씩 꺼내줘야 돼서 안 된다. 애초에 Query Set이기도 하고. 그리고 그렇게 모은 결과물을 페이지네이션해서 구현 성공.
- 해결 전 코드
# views.py
def search_view(request):
if request.method == 'GET':
searched = request.GET.get('search')
results = searched.split(',')
search = []
for result in results :
photos = PostModel.objects.filter(tags__contains=result)
paginator = Paginator(photos, 12) # 한 페이지에 게시글 12개
page = request.GET.get('page') # page에 해당하는 value 받아오기
posts = paginator.get_page(page)
search.append(posts)# 받아온 value에 해당하는 페이지 반환
return render(request, 'result.html', {'searched': searched, 'posts' : search})
# result.html
<div id="container">
{% for post in posts %}
{% for feed in post %}
<div>
<div>
<a href="{% url 'Post:post_view' feed.id %}">
<img style="border-radius: 20px;" src="{{ feed.photo.url }}" alt="..." class="image" />
</a>
</div>
</div>
{% endfor %}
<div id="pagination">
{% if post.has_previous %}
<a href="?page=1&search={{searched}}">맨앞</a>
<a href="?page={{ post.previous_page_number }}&search={{searched}}">이전</a>
{% endif %}
<span>{{ post.number }}</span>
<span>/</span>
<span>{{ post.paginator.num_pages }}</span>
{% if post.has_next %}
<a href="?page={{post.next_page_number}}&search={{searched}}">다음</a>
<a href="?page={{post.paginator.num_pages}}&search={{searched}}">맨뒤</a>
{% endif %}
</div>
{% endfor %}
</div>
- 해결 후 코드
# views.py
def search_view(request):
if request.method == 'GET':
searched = request.GET.get('search')
results = searched.split(',')
search = []
for result in results :
photos = PostModel.objects.filter(tags__contains=result)
search += photos
paginator = Paginator(search, 12) # 한 페이지에 게시글 12개
page = request.GET.get('page') # page에 해당하는 value 받아오기
posts = paginator.get_page(page)
return render(request, 'result.html', {'searched': searched, 'posts' : posts})
# result.html
<div id="container">
{% for post in posts %}
<div>
<div>
<a href="{% url 'Post:post_view' post.id %}">
<img style="border-radius: 20px;" src="{{ post.photo.url }}" alt="..." class="image" />
</a>
</div>
</div>
{% endfor %}
<div id="pagination">
{% if posts.has_previous %}
<a href="?page=1&search={{searched}}">맨앞</a>
<a href="?page={{ posts.previous_page_number }}&search={{searched}}">이전</a>
{% endif %}
<span>{{ posts.number }}</span>
<span>/</span>
<span>{{ posts.paginator.num_pages }}</span>
{% if posts.has_next %}
<a href="?page={{posts.next_page_number}}&search={{searched}}">다음</a>
<a href="?page={{posts.paginator.num_pages}}&search={{searched}}">맨뒤</a>
{% endif %}
</div>
</div>
- 알게 된 점 : 빈 리스트에 +로 추가하는 것과 append로 추가하는 것의 형태 차이
WIL에 적은 계획 진행상황
- [x] 이번 프로젝트 코드리뷰
- [x] 마무리 못한 기능 마무리
- [ ] 장고 심화 강의 듣기 → 1주차는 수강 완료
- [x] 프로젝트 기간 동안 듣지 않은 거북이 강의 보기
- [ ] 좋아요 기능이랑 팔로우-팔로잉 기능 구현해보기
- [ ] many-to-many 활용해보기 → 좋아요 구현하면서 하면 될 듯
- 시간이 남는다면
- [ ] 코드리뷰 하면서 팀원분 설명 참고해서 소셜 로그인 구현해보기
반응형
'Programming > TIL and WIL' 카테고리의 다른 글
| 221026 TIL (0) | 2022.10.26 |
|---|---|
| 221025 TIL (0) | 2022.10.26 |
| 💖Weekly I Learned💖 (0) | 2022.10.22 |
| 💖221021 Today I Learned💖 (0) | 2022.10.22 |
| 💖221020 Today I Learned💖 (0) | 2022.10.21 |