Django-mysite만들기10 게시판 javascript 페이징, 검색기능 추가

|

django 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로 페이징과 검색 처리하기

paging.js 코드보기

views


list.html 코드보기 - 리스트 view

views

이렇게 검색과 페이징 기능 추가를 완료!


django url namespace로 get parameter보내기

template에서 url namespace로 url을 처리할때는

views

위와 같이 처리하면 urls.py에서 /뒤의 값으로도 받을 수 있고,

views.py에서 ?파라미터를 받는 kwd = request.GET.get('kwd') 코드로도 받을 수 있다.



페이징 처리

views
views

검색 했을 때

views