{% extends "base.html" %}
{% block content %}
<div class="row mt-5">
<div class="col-12">
<table class="table">
<thead class="thead-dark">
<tr>
<th scope="col">#</th>
<th scope="col">제목</th>
<th scope="col">아이디</th>
<th scope="col">작성일</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">1</th>
<td>제목 테스트 입니다</td>
<td>member</td>
<td>2020.12.12</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="row">
<div class="col-12">
<button class="btn btn-primary">글쓰기</button>
</div>
</div>
{% endblock %}
'board'/ 로 시작되는 경로 설정하기 - 'board'/ 아래로 연결되는 경로는 board 앱의 urls.py 에서 관리하겠다.
맨아래 urlpatterns 의 path 를 설정했다.
from django.contrib import admin
from django.urls import path, include
from member.views import home
urlpatterns = [
path('admin/', admin.site.urls),
path('member/', include('member.urls')),
path('', home),
path('board/', include('board.urls')),
]
'board'/ 아래로 연결되는 경로 중 게시판의 리스트를 보여주는 엔드포인트와 연결 되었을 때 실행되는 함수를 넣어준다.
from django.urls import path
from . import views
urlpatterns = [
path('list/', views.board_list),
]
http://127.0.0.1:8000/board/list 로 연결될 때 현재 board 앱 경로의 views.py 의 board_list 함수가 실행된다.
하지만 아직 board_list 함수는 만들지 않았다.
그래서 에러 메시지를 확인할 수 있다.
이제 view 에 board_list() 함수를 만든다. 일단 실행 확인을 위해서 리턴 렌더 코드만 작성해 놓고 실행해 본다.
from django.shortcuts import render
def board_list(request):
return render(request, 'board_list.html')
http://127.0.0.1:8000/board/list 로 서버에 요청을 보냈을 때,
아래와 같은 화면을 확인할 수 있다.
여기서 내가 직접 html 에 써넣은 테이블 항목의 내역 데이터를 확인할 수 있다.
이제 모델을 만들고 그 모델의 제목, 내용, 작성자 등을 가져오게 하는 코드를 작성해야 한다.
게시판에는 어떤 요소들이 필요할까. 게시글 제목, 글 내용, 작성자, 글 작성일자 등이 필요할 것이다. 모델을 작성하자.
from django.db import models
class Board(models.Model):
title = models.CharField(max_length=200, verbose_name="제목")
contents = models.TextField(verbose_name="내용")
writer = models.ForeignKey('member.BoardMember', on_delete=models.CASCADE, verbose_name="작성자")
created_at = models.DateTimeField(auto_now_add=True, verbose_name="작성일")
updated_at = models.DateTimeField(auto_now=True, verbose_name="최종수정일")
def __str__(self):
return self.title
class Meta:
db_table = 'boards'
verbose_name = '게시판'
verbose_name_plural = '게시판'
아래의 코드를 확인해보면, 게시물과 멤버의 관계가 foreignkey 로 연결되어 있다.
on_delete 조건은 회원가입 한 사용자가 삭제되면 그 사용자가 작성한 게시글도 모두 지워버리겠다는 의미이다.
writer = models.ForeignKey('member.BoardMember', on_delete=models.CASCADE,
verbose_name="작성자")
from django.shortcuts import render
from .models import Board
def board_list(request):
boards= Board.objects.all().order_by('-id')
return render(request, 'board_list.html', {"boards":boards})
모델 Board 객체를 다 불러오고 그것을 역순으로 최신사항을 먼저 보이게 가져오겠다의 코드이다.
render 파라미터에 {"boards": boards} 를 넣고, board_list.html 에 {{ boards }} 를 넣어보자.
마이그레이션 등록을 한 뒤 보여지는 화면을 확인하면,
갑자기 없던
< QuerySet[] > 이 생겨 있다.
대괄호 사이 비어 있는 이유는 아직 작성된 글이 없어서이다.
관리자 페이지에서 직접 글을 작성해 넣어보기 위해 admin.py 를 만들자.
from django.contrib import admin
from .models import Board
class BoardAdmin(admin.ModelAdmin):
list_display = ('title', 'writer', 'created_at', 'updated_at')
admin.site.register(Board, BoardAdmin)
admin 관리자 페이지에 들어가서 직접 글을 작성해서 저장한 뒤, /board/list 를 들어가 보면,
< QuerySet[Board:테스트블라블라.....] >
무언가가 들어가 있는 것을 확인할 수 있다.
html 에 임시로 보이는 데이터를 없애고 이제 이 부분에 Board 모델에서 불러오는 필드를 불러오게 해야 한다.
{% extends "base.html" %}
{% block content %}
<div class="row mt-5">
<div class="col-12">
<table class="table">
<thead class="thead-dark">
<tr>
<th scope="col">#</th>
<th scope="col">제목</th>
<th scope="col">아이디</th>
<th scope="col">작성일</th>
<th scope="col">최종수정일</th>
</tr>
</thead>
<tbody>
{% for board in boards %}
<tr>
<th scope="row">{{ board.id }}</th>
<td>{{ board.title }}</td>
<td>{{ board.writer }}</td>
<td>{{ board.created_at }}</td>
<td>{{ board.updated_at }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
<div class="row">
<div class="col-12">
<button class="btn btn-primary">글쓰기</button>
</div>
</div>
{% endblock %}
테이블 바디 부분에 반복문과 board 객체에서 불러오는 model 의 id, title, writer, created_at, updated_at 을 보여져야 할 요소에 넣어놓은 것을 확인한다.