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')
코드로도 받을 수 있다.