Django-mysite만들기10 게시판 javascript 페이징, 검색기능 추가
26 Jun 2019 | django python django-ormdjango mini project
cafe24신입사원 교육과정 - django 수업 내용 정리
django- javascript로 검색과 페이징 구현하기
여러가지 방법으로 구현해보고 싶어서
페이징처리의 페이지는 url의 path variable 형태로 받고,
검색의 키워드는 url의 ?a=b형태의 파라미터로 받아서 처리했다.
url 예시 : http://localhost:8888/board/list?kwd=키워드
urls.py
page의 경우 page를 선택한 순간 항상 해당 페이지의 상태를 유지해야 하기 떄문에 모든 url에서 page 값을 받았다.
from django.urls import path
from . import views
app_name = 'board'
urlpatterns = [
    path('list/<int:page>', views.list, name='list'),
    path('list/', views.list, name='list'),
    path('writeform/<int:page>', views.writeform, name='writeform'),
    path('writeform/<int:no>/<int:page>', views.writeform, name='reply_writeform'),
    path('write/<int:page>', views.write, name='write'),
    path('<int:no>/<int:page>', views.view, name='view'),
    path('modify/<int:no>/<int:page>', views.modifyform, name='modifyform'),
    path('modify/<int:page>', views.modify, name='modify'),
    path('delete/<int:no>/<int:page>', views.delete, name='delete'),
]
views.py
page의 경우 dafault를 1값으로 처리해, 페이지가 없는 경우 항상 1페이지로 보냈다.
키워드의 경우, 스트링 파라미터의
?kwd=kwd형태로 오기 때문에request.GET.get('kwd')코드를 통해 kwd 변수로 받아주었다.
django orm을 통해 해당 키워드의 게시글은
Board.objects.filter(title__contains=kwd)코드로 조회했다.
PAGESIZE=10 # 한 페이지에 보여줄 게시글 수
def list(request, page=1):
    # 키워드의 받기
    kwd = request.GET.get('kwd')
    
    # 키워드가 없는 경우 모든 게시글 조회
    if kwd is None or kwd is '' or kwd == 'null':
        start = (page - 1) * PAGESIZE
        board_count = Board.objects.count()
        boardlist = Board.objects.all().order_by('-groupno','orderno')[start:start+PAGESIZE]
    # 키워드가 있는 경우 해당 키워드만 조회
    else:
        start = (page - 1) * PAGESIZE
        board_count = Board.objects.filter(title__contains=kwd).count()
        boardlist = Board.objects.filter(title__contains=kwd).order_by('-groupno', 'orderno')[start:start + PAGESIZE]
	
    # template에 총 게시글 수와 현재 페이지 정보를 보내준다.
    data = {
        'boardlist': boardlist,
        'board_count': board_count,
        'current_page': page,
        'page':page,
    }
    # 검색어가 null인 경우 javascript에서 처리해줘야한다.
    kwd = request.GET.get('kwd')
    if kwd is None:
        data['kwd'] = json.dumps(kwd)
    else:
        data['kwd'] = kwd
    return render(request, 'board/list.html', data)
검색어가 null인 경우, javascript에서 Python의 None값을 인식하지 못해
data['kwd'] = json.dumps(kwd)json형태로 변환해서 보내주었다.
다른 뷰에서 page, keyword 정보 유지하기
글 상세 조회 후, 답글 등록 후 등 여러 상황이 끝난 뒤 항상 기존의 page와 keyword정보를 갖고 제자리로 돌아가야 하는 처리
def modify(request, page=1):
    ... # 코드 생략 ...
    
    data = {
        'board':board,
        # page 추가
        'page':page,
    }
    # 검색어 추가
    kwd = request.GET.get('kwd')
    # 자바스크립트를 위한 처리
    if kwd is None:
        data['kwd'] = json.dumps(kwd)
    else:
        data['kwd'] = kwd
	
    return HttpResponseRedirect('/board/'+board_id+'/'+str(page), data)
javascript로 페이징과 검색 처리하기
list.html 코드보기 - 리스트 view
이렇게 검색과 페이징 기능 추가를 완료!
django url namespace로 get parameter보내기
template에서 url namespace로 url을 처리할때는
위와 같이 처리하면 urls.py에서 /뒤의 값으로도 받을 수 있고,
views.py에서 ?파라미터를 받는 kwd = request.GET.get('kwd') 코드로도 받을 수 있다.
페이징 처리
검색 했을 때
        
              콩정의 개발 정리 블로그