이 블로그 검색

2012년 8월 7일 화요일

Django 게시판 만들기 2 - 글쓰기 기능 구현

글쓰기 기능 구현

이제 글쓰기 기능을 구현할 차례이다. 글쓰기 버튼을 클릭시에 /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

이어지는 글 :

Django 게시판 만들기 3 - 글 조회 및 수정, 삭제 기능 구현

댓글 1개:

  1. 힘들다...이거 raw SQL을 sqlite3로 바꿔주심 안될까요? ㅠ.ㅠ

    답글삭제