2010년 6월 7일 월요일

13 - 2) 입력한 Bookmark 보기

앞선 북마크 작성하기에서 사용자가 생성한 북마크(DB에 저장된 북마크)를 확인하는 페이지를 만들어 보겠습니다.

저장된 북마크를 확인한다는 것은 저장된 내용을 보는 것을 의미하며 우리가 앞서 수립한 데이터 모델(테이블)에 저장되어 있습니다. Bookmark 확인은 다음의 과정을 통해 이뤄집니다.

  1. django 데이터 모델 API를 사용해서 북마크 목록을 가져옵니다.
  2. 템플릿에 북마크 목록을 전달해서 출력합니다.

 

북마크 목록을 가져오는 것은 상황에 따라 달라집니다만 우리는 일단 전체 목록을 가져오는 것으로 할 것입니다. 그 다음으로 목록을 출력하는 페이지의 구성을 거의 유사합니다. 북마크를 링크로 표현하고 태그와 사용자 정보를 그 아래에 출력하도록 할 계획입니다.

 

먼저 다음과 같은 페이지를 만들어 봅시다.(template 디렉토리 아래에 bookmark_list.html 로 저장합니다.)

 

  1. template/bookmark_list.html
  2. {% if bookmarks %}
  3. <ul class="bookmarks">
  4.    {% for bookmark in bookmarks %}
  5.    <li>
  6.        <a href="{{ bookmark.link.url }}" class="title">{{ bookmark.title }}</a><br />
  7.        {% if show_tags %}
  8.        태그 :
  9.            {% if bookmark.tag_set.all %}
  10.            <ul class="tags">
  11.                {% for tag in bookmark.tag_set.all %}
  12.                <li>{{ tag.name }}</li>
  13.                {% endfor %}
  14.            </ul>
  15.            {% else %}
  16.            입력된 태그가 없습니다.
  17.            {% endif %}
  18.            <br />
  19.        {% endif %}
  20.        {% if show_user %}
  21.            추가한 사용자 :
  22.            <a href="/usr/{{ bookmark.user.username }}/" class="username">{{ bookmark.user.username }}</a>
  23.        {% endif %}
  24.    </li>
  25.    {% endfor %}
  26. </ul>
  27. {% else %}
  28.    <p>북마크가 없습니다.</p>
  29. {% endif %}

 

이 파일에서  {% if bookmarks %} 부분은 뷰와 연결시 사용자가 저장한 북마크가 있는지를 판단하는 부분입니다. 사용자가 입력한 북마크가 있을 경우 저장된 북마크를 보는 것이고 그렇지 않다면 아래로 내려와 "북마크가 없습니다"를 화면상에 출력합니다.

사용자가 저장한 북마크가 있을 시 모든 북마크들이 bookmarks 변수에 사용자의 북마크들이 리스트의 형태로 저장됩니다.

여기서 개별 값에 접근하기 위해 {% for bookmark in bookmarks %} 를 사용합니다. bookmarks 변수에 저장된 북마크 만큼 순회하면서 각 순회시 변수 bookmark에 각 북마크들이 임시 저장됩니다. 이제 변수 bookmark는 개별 북마크 값을 갖고 있습니다.

{% if show_tags %}는 뷰에서 전달된 show_tags 변수가 True이면 해당 내용을 보여주는 코드로 아래에 보시면 show_user라는 변수도 있습니다. 역시 show_tags와 동일한 역할이겠죠? 이런 변수들을 추가한 이유는 위에서 생성한 북마크를 보기위한 페이지인 bookamark_list.html을 보다 유연하게 사용하기 위해서 입니다. show_ 계열의 변수들의 참/거짓을 통해 사용자에게 보여주는 부분을 달리 할 수 있기 때문입니다. 지금 우리가 보여주고자 하는 북마크 리스트는 사용자 홈에서 보여지는 것이므로 show_user는 전달되지 않을 계획입니다(뷰에서 전달하지 않으면 False가 됩니다) .

이상으로부터 우리는 북마크 리스트를 보여주기 위한 기본 Template을 만들었습니다.

 

위의 파일은 일종의 모듈화로써 이 bookmark_list.html 파일은 북마크 리스트들을 보여주는 기능을 갖고 있습니다.

이 기능을 사용자 홈페이지에 넣어보도록 하겠습니다.

기존의 userHome.html 을 다음과 같이 변경해 봅시다. (template 아래에 사용자 홈페이지를 보여주기 위해 작성한 파일입니다.)

 

  1. template/userHome.html
  2. {% extends "base.html" %}
  3. {% block title %} Main page {% endblock %}
  4. {% block head %} 안녕하세요! {% endblock %}
  5. {% block content %}
  6.    {{username}} 님의 개인정보 페이지
  7.     <hr />
  8.    {% include "bookmark_list.html" %}
  9. {% endblock %}

 

다음으로 전달하고자 하는 북마크 리스트, 사용자 홈에서 Tag를 보여주기 위해 변수 show_tags를 True로 하여 템플릿에 적절한 변수를 보내기 위해 뷰 함수를 변경해 보겠습니다.

다음과 같이 views.py의 userHomePage 뷰를 변경합니다.

 

  1. 애플리케이션/views.py
  2. from django.shortcuts import get_object_or_404
  3. ...
  4. @login_required
  5. def userHomePage(request, username):
  6.     user = get_object_or_404(User, username=username)
  7.    bookmarks = user.bookmark_set.order_by('-id')
  8.    variables =RequestContext(request,
  9.                              {'username' : username,
  10.                               'bookmarks': bookmarks,
  11.                               'show_tags': True
  12.                               }   )
  13.    return render_to_response('userHome.html', variables)

 

코드상으로 많은 부분이 변경된 것 같지만 기존의 사용자 로그인 확인을 @login_required 데코레이터로 변경하고 사용자의 입력(여기서는 사용자 아이디를 통해 사용자 홈페이지로 이동하는 것입니다.)을 get_object_or_404 를 통해 확인합니다. 즉, 사용자가 입력한 사용자 아이디를 가져와서 User 데이터 모델의 username 열에 있는지 검사하여 없으면 404에러(페이지가 존재하지 않음을 나타내는 에러)를 발생하고 그렇지 않으면 즉, 해당 사용자 아이디가 존재하면 user 변수에 저장합니다. 북마크는 order_by를 이용하여 입력된 역순으로 다시말해 최근 저장된 북마크부터 목록을 가져옵니다. 가져온 값들은 bookmarks 변수에 저장됩니다. 그리고 이제 username과 bookamrks, 그리고 show_tags변수를 True로 하여 Template과 연결하여 사용자에게 보여줍니다.

 

위와 같이 작성을 한 결과는 다음과 같습니다.

 

shot02.png

 

 

이 글은 스프링노트에서 작성되었습니다.

댓글 없음:

댓글 쓰기