Django 로 게시판 만들기(16). 게시판리스트 MVT 패턴 만들기 - 1

.·2020년 7월 28일
0

게시판만들기

목록 보기
16/21

1. board 앱 - 화면만들기 (html)

  • base.html 복사해서
  • board_list.html 파일 생성
  • 부트스트랩에서 table 검색 후 적절한 것 가져다 붙여넣음
{% 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 %}

2. config/urls.py

'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')),
]

3. board/urls.py

'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 함수는 만들지 않았다.
그래서 에러 메시지를 확인할 수 있다.

4. board/views.py

이제 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 에 써넣은 테이블 항목의 내역 데이터를 확인할 수 있다.

이제 모델을 만들고 그 모델의 제목, 내용, 작성자 등을 가져오게 하는 코드를 작성해야 한다.

5. board/models.py

게시판에는 어떤 요소들이 필요할까. 게시글 제목, 글 내용, 작성자, 글 작성일자 등이 필요할 것이다. 모델을 작성하자.

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="작성자")

6. board/views.py 모델 임포트, 쿼리셋, 정렬

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 를 만들자.

7. board/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 모델에서 불러오는 필드를 불러오게 해야 한다.

8. board_list.html 수정

{% 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 을 보여져야 할 요소에 넣어놓은 것을 확인한다.

profile
.

0개의 댓글