글쓰기 기능 구현

이제 글쓰기 기능을 구현할 차례이다.

글쓰기 버튼을 클릭시에 /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>
</html>

등록 버튼 처리가 /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로 직접 처리하였다.

이제 글 작성 버튼을 누르고 글을 써보자.

blog-image

등록 버튼을 누르면, 전체 목록으로 돌아온다.

blog-image

글작성과 목록 출력을 구현했다. 이제 목록에서 해당글을 선택시 내용 조회를 위한 기능이 필요하다.

이 예제의 전체 소스는 아래에서 받을 수 있다.

https://github.com/jeremyko/dj_board