장고
점프 투 장고 3-16 답변 페이징 -2
우히힝
2021. 9. 14. 16:36
github 주소 :https://github.com/wkdtpzld/again/tree/57c58fc888c200f32214ba33238533bbb721b69e
GitHub - wkdtpzld/again
Contribute to wkdtpzld/again development by creating an account on GitHub.
github.com
<h5 class="border-bottom my-3 py-2">{{question.answer_set.count}}개의 답변이 있습니다.</h5>
<div class='row justify-content-bteween my-3'>
<div class='col-2'>
<select class='form-control so'>
<option value='recommend' {% if so == 'recommend' %}selected{% endif %}>추천순</option>
<option value='recent' {% if so == 'recent' %}selected{% endif %}>최신순</option>
</select>
</div>
<div class='col-4 input-group'>
<input type='text' class='form-control kw' value='{{ kw|default_if_none:'' }}'>
<div class='input-group-append'>
<button class='btn btn-outline-secondary' type='button' id='btn_search'>찾기
</div>
</div>
</div>
{% for answer in answer_list %}
templates/pybo/question_detail
for in 문 위쪽에 추천과 최신순으로 필터링 할 수 있는 코드를 적어놨다.
so = select 옵션
kw = textinput 옵션
으로 구별이 되어있다.
endblock 위쪽에 searchForm를 적어 GET방식을 요청할 수 있게 하였다.
<form id='searchForm' method='get' action='{% url 'pybo_site:detail' question.id %}'>
<input type='hidden' id='kw' name='kw' value='{{ kw|default_if_none:'' }}'>
<input type='hidden' id='page' name='page' value="{{ page }}">
<input type='hidden' id='so' name='so' value="{{ so }}">
</form>
또한
{% if answer_list.has_previous %}
<li class='page-item'>
<a class='page-link' data-page="{{ answer_list.previous_page_number }}" href='#'>이전</a>
</li>
{% else %}
<li class='page-item disabled'>
<a class='page-link' tabindex='-1' aria-disabled='true' href='#'>이전</a>
</li>
{% endif %}
{% for page_number in answer_list.paginator.page_range %}
{% if page_number >= answer_list.number|add:-5 and page_number <= answer_list.number|add:5 %}
{% if page_number == answer_list.number %}
<li class='page-item active' aria-current='page'>
<a class='page-link' data-page="{{ page_number }}" href='#'>{{ page_number }}</a>
</li>
{% else %}
<li class='page-item'>
<a class='page-link' data-page="{{ page_number }}" href='#'>{{ page_number }}</a>
</li>
{% endif%}
{% endif %}
{% endfor %}
{% if answer_list.has_next %}
<li class='page-item'>
<a class='page-link' data-page="{{ answer_list.next_page_number }}" href='#'>다음</a>
</li>
{% else %}
<li class='page-item disabled'>
<a class='page-link' tabindex='-1' aria-disabled='true' href='#'>다음</a>
</li>
{% endif %}
href 속성에 직접 입력을 삭제하고 data-page 속성을 적어놨다.
$('.page-link').on('click',function(){
$('#page').val($(this).data('page'));
$('#searchForm').submit();
});
$('#btn_search').on('click',function(){
$('#kw').val($('.kw').val());
$('#page').val(1);
$('#searchForm').submit();
});
$(".so").on('change', function() {
$("#so").val($(this).val());
$("#page").val(1);
$("#searchForm").submit();
});
자바 스크립트에 검색 스크립트를 설정해놓았다. 본인은 자바스크립트를 잘 다룰줄 모르므로 도움을 요청했다.
html를 끝냈으면 M - T - V인 v로 이동
views.py의 detail을 변경
def detail(request,question_id):
question = get_object_or_404(Question,pk=question_id)
page = request.GET.get('page','1')
kw = request.GET.get('kw','')
so = request.GET.get('so','recommend')
if so == 'recommend':
answer_list=Answer.objects.filter(question=question).annotate(num_voter=Count('voter')).order_by('-num_voter','-create_date')
elif so == 'recent':
answer_list=Answer.objects.filter(question=question).order_by('-create_date')
if kw:
answer_list = answer_list.filter(
Q(content__icontains=kw) |
Q(author__username__icontains =kw)
).distinct()
paginator = Paginator(answer_list, 3)
page_obj = paginator.get_page(page)
context = {'question':question,'answer_list':page_obj,'page':page, 'kw':kw, 'so':so}
return render(request, 'pybo/question_detail.html',context)
기존에 있던 index와 유사하다. 다른점이라면 답변 링크의 초기 설정이 recommend로 설정되어있다.
서버 가동
추천순으로 잘 나온다.
개인적으로 한 내용을 적는 내용이라 설명에 문제가 많은 것 같다. 죄송쓰