- 데이터베이스 (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')
'Study > django' 카테고리의 다른 글
django 기초 - bootstrap을 이용한 사이트 만들기 : 8. 글 수정, 삭제 (0) | 2021.08.23 |
---|---|
django 기초 - bootstrap을 이용한 사이트 만들기 : 6. 게시판 글 등록 (0) | 2021.08.22 |
django 기초 - bootstrap을 이용한 사이트 만들기 : 5. 로그아웃과 로그인세션 (0) | 2021.08.22 |
django 기초 - bootstrap을 이용한 사이트 만들기 : 4. 가입 페이지 (0) | 2021.08.19 |
django 기초 - bootstrap을 이용한 사이트 만들기 : 3. 로그인 페이지 만들기 (0) | 2021.08.19 |