본문 바로가기

Study/django

django 기초 - bootstrap을 이용한 사이트 만들기 : 7. 글 목록, 게시글 확인

 - 데이터베이스 (Bbs 클래스)에 저장된 데이터를 가져와 게시판에 글 목록 출력

 - 글 목록에서 제목을 클릭하면 해당 글 페이지로 이동

1. 데이터베이스에 저장된 게시글 데이터

 - views.py 에서 데이터베이스와 객체를 매핑시킨다.

 - modelClass.objects.all() 은 DBMS 의 SQL문 select * from table 과 같다. 즉 테이블에 저장 되어있는 모든데이터를 가지고 온다.

 - 가져온 데이터의 타입은 QuerySet으로 저장된 데이터가 묶여있는것을 확인할 수 있다.

 

# views.py
def list(request):
    orm_obj = Bbs.objects.all()
    print(' ------- orm_obj.all() type :', type(orm_obj))
    print(' ------- orm_obj.all() :', orm_obj)
    context = {
        'bbs' : orm_obj,
        'session_user_name': request.session['user_name'],
        'session_user_id': request.session['user_id']
    }
    return render(request, 'bbs/list.html', context)

 

 - 게시글 페이지로 이동할 때, 데이터베이스에 저장된 게시글 데이터를 모두 가져온다.

 - 페이지가 rend될 때, context (dict형)으로 데이터를 함께 전송시켜준다.

 - 이제 html 문서에서 전송받은 데이터를 출력시켜주면 된다.

 

	{% if bbs %}
	<tbody id="tbody">
	{% for post in bbs %}
	<tr>
		<td>{{post.id}}</td>
		<td><a href="OOO">{{post.title}}</a></td>
		<td>{{post.writer}}</td>
		<td>{{post.regdate}}</td>
		<td><span class="badge bg-red">{{post.viewcnt}}</span></td>
	</tr>
    {% endfor %}

	</tbody>
	{% else %}
		<p> 게시글이 없습니다 !!! </p>
	{% endif %}

 

 - views.py의 list 함수로부터 context로 게시글 데이터를 전송 받는다

 - 템플릿 메서드로 전송받은 데이터에서 for문을 통해 각 쿼리문 데이터를 출력한다.

 - {% if bbs %} 를 통해 데이터가 없는 상황에도 오류없이 대처할 수 있다.

 - title 앞 <a> 태그의 get 방식을 이용해 각 게시글 페이지로 이동하도록 연결 할 수 있다.

게시글 無(좌) , 게시글 有(우)


 2. 게시글 제목을 눌렀을 때, 해당 글 페이지로 이동하기

 - 게시글의 제목(title)을 클릭하면, <a> 태그로 해당 url로 이동한다.

 - 게시글 고유 index(id)값을 get 방식으로 서버로 전송하고, 서버에서는 전송된 정보를 포함하여 read.html과 rend 해준다.

 - list.html에서 get 방식으로 백엔드로 데이터를 전송할때, url을 명시하는 방법에는 두 가지 방법이 있다.

 하나는 url/?id={{post.id}} , 다른 하나는 {% url 'get_content' id=post.id %}로 템플릿 메서드를 사용하는 것이다.

 url 템플릿은 장고 특징으로 두 방법에 따라 urls와 view를 구성하는데 차이가 있다.

1. {% url 'get_content' id=post.id %}

	<tr>
		<td>{{post.id}}</td>
		<td><a href="{% url 'bbs_get_content' id=post.id %}">{{post.title}}</a></td>
		<td>{{post.writer}}</td>
		<td>{{post.regdate}}</td>
		<td><span class="badge bg-red">{{post.viewcnt}}</span></td>
	</tr>
# urls.py
 path('bbs_get_content/<int:id>', views.bbs_get_content, name='bbs_get_content'),
 
 # views.py
 def bbs_get_content(request, id):
    # 장고의 url get 방식을 사용하면, views에서 함수의 인자값으로 param값이 넘어온다.
    if request.method == 'GET':
        print('- -- -- -bbs_get_content ------')
        orm_obj = Bbs.objects.get(id=id)
        orm_obj.viewcnt += 1
        orm_obj.save()
        context = {
            'orm_obj' : orm_obj,
            'session_user_name': request.session['user_name'],
            'session_user_id': request.session['user_id']
        }
        return render(request, 'bbs/read.html', context)

 

 - html 코드에서 {% url %}  -> url 메서드를 사용하기 위해서 path에 name이 반드시 등록돼 있어야 한다.

 - html 문서에서 get 메서드로 넘겨받은 값은 views 함수의 parameter로 입력된다.

2. ../bbs_get_content/?id={{post.id}}

	<tr>
		<td>{{post.id}}</td>
		<td><a href="../bbs_get_content/?id={{post.id}}">{{post.title}}</a></td>
		<td>{{post.writer}}</td>
		<td>{{post.regdate}}</td>
		<td><span class="badge bg-red">{{post.viewcnt}}</span></td>
	</tr>
# urls.py
    path('bbs_get_content/', views.bbs_get_content, name='bbs_get_content'),
    
# views.py
def bbs_get_content(request):
    if request.method == 'GET':
        print('---- bbs_get_content ----- ')
        orm_obj = Bbs.objects.get(id=request.GET['id'])
        orm_obj.viewcnt += 1
        orm_obj.save()
        context = {
            'orm_obj' : orm_obj,
            'session_user_name': request.session['user_name'],
            'session_user_id': request.session['user_id']
        }
        return render(request, 'bbs/read.html', context)

 

 - 일반적인 GET방식은 지금까지 해온것과 크게 차이 없다.

 - orm_obj.viewcnt += 1 와 save()를 통해 클릭 할 때마다 데이터베이스의 값이 갱신되고, list.html파일로 돌아갔을때 바로 반영된다.

게시글 표시하기

<div class="box-body">
	....
		<label for="exampleInputEmail1">Title</label> <input type="text"
			name='title' class="form-control" value="{{orm_obj.title}}"
			readonly="readonly">
            ....
</div>

 

 - value 값이나 태그가 없는 부분(내용) context로 넘겨받은 데이터의 각 속성값을 입력하여 화면에 출력시킬 수 있다.

다시 글 목록으로 돌아가기

<div class="box-footer">
	<button type="submit" class="btn btn-primary" id="list_all">LIST ALL</button>
</div>	
<script>
$(document).ready(function(){
	$('#list_all').click(function() {
		location.href = '../list_all' ;
	})
});
</script>
# urls.py
path('list_all', views.list_all, name='list_all')

# views.py
def list_all(requets):
    return redirect('list')