이제 글쓰기 기능을 구현할 차례이다. 글쓰기 버튼을 클릭시에 /show_write_form 이 호출되므로, 이 url을 컨트롤러에 맵핑해서 글쓰기 기능을 구현하면 된다. 먼저 /sample_board/view.py파일에 글쓰기를 위한 컨트롤러를 추가한다.
def show_write_form(request):
return render_to_response('writeBoard.html')
그리고 dj_board/urls.py 에 다음처럼 추가한다.
urlpatterns = patterns('',
url(r'^$', views.home),
url(r'^show_write_form/$', views.show_write_form),
)
요청을 받으면 글작성을 위한 템플릿만을 화면에 출력하는 부분이므로 간단하게 처리한다. 그럼 이제, writeBoard.html 템플릿을 작성해야 한다. templates 폴더에 writeBoard.html 를 다음처럼 생성한다. form을 이용한 간단한 작성화면이 되겠다.
writeBoard.html
<script language="javascript">
function writeCheck() {
var form = document.writeform;
if (!form.name.value)
{
alert("이름을 적어주세요");
form.name.focus();
return;
}
if (!form.subject.value) {
alert("제목을 적어주세요");
form.subject.focus();
return;
}
if (!form.memo.value) {
alert("내용을 적어주세요");
form.memo.focus();
return;
}
form.submit();
}
</script>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>게시판 글쓰기</title>
</head>
<table width=700 border=1 cellspacing=0 cellpadding=5>
<form name=writeform method=post action="/DoWriteBoard/">
<tr><td><b>이름</b></td><td><input type=text name=name size=50 maxlength=50></td></tr>
<tr><td><b>이메일</b></td><td><input type=text name=email size=50 maxlength=50></td></tr>
<tr><td><b>제목</b></td><td><input type=text name=subject size=50 maxlength=50></td></tr>
<tr><td><b>내용</b></td><td><textarea name=memo cols=50 rows=10></textarea></td></tr>
</form>
</table>
<table width=700 border=1 cellspacing=0 cellpadding=0>
<tr><td>
<input type=button value="등록" OnClick="javascript:writeCheck();">
</td></tr>
</table>
등록 버튼 처리가 /DoWriteBoard/ 에서 이루어지게 했으므로, 마찬가지로 url과 컨트롤러를 맵핑한다. /sample_board/view.py파일에 컨트롤러를 추가한다.
@csrf_exempt
def DoWriteBoard(request):br = DjangoBoard (subject = request.POST['subject'],
name = request.POST['name'],
mail = request.POST['email'],
memo = request.POST['memo'],
created_date = timezone.now(),
hits = 0
)
br.save()
# 저장을 했으니, 다시 조회해서 보여준다.
url = '/listSpecificPageWork?current_page=1'
return HttpResponseRedirect(url)
그리고 dj_board/urls.py 에 다음처럼 추가한다.
urlpatterns = patterns('',
url(r'^$', views.home),
url(r'^show_write_form/$', views.show_write_form),
url(r'^DoWriteBoard/$', views.DoWriteBoard),
)
그런데 여기서 @csrf_exempt 은 무엇일까? django 1.2부터 post로 값을 전송시 CSRF 보안 목적으로 추가된 것이라고 한다. 아무튼 이것이 설정 안되면 오류가 발생하니 따라하기로 하고 상세 내용은 여기를 참고하라. 데이터를 저장하는것은 위 예제처럼 model 을 이용해서 간단하게 처리할수 있다. POST 전송된 값을 참조하기 위해서 request.POST['subject'] 이런식으로 값을 얻어올수 있다. 저장후에 다시 화면을 초기화 시키기 위해서 /listSpecificPageWork url을 사용했다. 그럼 당연히 이 url도 컨트롤러와 맵핑을 해줘야겠다.
먼저 컨트롤러에 다음을 추가하고..
def listSpecificPageWork(request):
current_page = request.GET['current_page']
totalCnt = DjangoBoard.objects.all().count()
print 'current_page=', current_page
# 페이지를 가지고 범위 데이터를 조회한다 => raw SQL 사용함
boardList = DjangoBoard.objects.raw('SELECT Z.* FROM(SELECT X.*, ceil( rownum / %s ) as page FROM ( SELECT ID,SUBJECT,NAME, CREATED_DATE, MAIL,MEMO,HITS \
FROM SAMPLE_BOARD_DJANGOBOARD ORDER BY ID DESC ) X ) Z WHERE page = %s', [rowsPerPage, current_page])
print 'boardList=',boardList, 'count()=', totalCnt
# 전체 페이지를 구해서 전달...
pagingHelperIns = pagingHelper();
totalPageList = pagingHelperIns.getTotalPageList( totalCnt, rowsPerPage)
print 'totalPageList', totalPageList
return render_to_response('listSpecificPage.html', {'boardList': boardList, 'totalCnt': totalCnt,
'current_page':int(current_page) ,'totalPageList':totalPageList} )
그리고 dj_board/urls.py 에 다음처럼 추가한다.
urlpatterns = patterns('',
url(r'^$', views.home),
url(r'^show_write_form/$', views.show_write_form),
url(r'^DoWriteBoard/$', views.DoWriteBoard),
url(r'^listSpecificPageWork/$', views.listSpecificPageWork),
)
listSpecificPage.html 템플릿은 앞서 이미 작성했다. 그리고 데이터를 조회할때 model을 이용하지 않고 Raw SQL로 직접 처리하였다. 이제 글 작성 버튼을 누르고 글을 써보자.
등록 버튼을 누르면, 전체 목록으로 돌아온다.
이 예제의 전체 소스는 아래에서 받을 수 있다.
https://github.com/jeremyko/dj_board
이어지는 글 :
힘들다...이거 raw SQL을 sqlite3로 바꿔주심 안될까요? ㅠ.ㅠ
답글삭제