Django 로 게시판 만들기(17). 게시판 글쓰기 MVT 패턴 만들기 - 2

.·2020년 7월 28일
0

게시판만들기

목록 보기
17/21

1. 게시판 글쓰기 화면 만들기.

  • board_list.html 복사해서 board_write.html 만들어서 넣기
  • base.html 과 연결
  • login.html 에서 사용했던 폼을 가져오기
  • 아래 버튼 이름을 글쓰기로 바꿈
""" 위의 코드 일부 생략.. """
<div class="row mt-5">
  <div class="col-12">
    """ 여기에 로그인 시 사용했던 폼을 갖다 붙여 넣었다. """
    <form method="POST" action=".">
      {% csrf_token %} {% for field in form %}
      <div class="form-group">
        <label for="{{ field.id_for_label }}">{{ field.label }}</label>
        <input
          type="{{ field.field.widget.input_type }}"
          class="form-control"
          id="{{ field.id_for_label }}"
          placeholder="{{ field.label }}"
          name="{{ field.name }}"
        />
      </div>
      {% if field.errors %}
      <span style="color: red;">{{ field.errors }}</span>
      {% endif %}
      {% endfor %}
      <button type="submit" class="btn btn-primary">글쓰기</button>
  </div>
</div>

두 세 차례 과정을 거친 뒤 다시 수정할 예정

2. forms.py 생성

member/forms.py 에서 복붙해 왔는데 그 코드에서 검증 부분은 지우고 나머지 코드를 조금 손봤다.

from django.contrib.auth.hashers import check_password

from django import forms
from .models import Board

class BoardForm(forms.Form):
    # 입력받을 값 두개
    title = forms.CharField(error_messages={
        'required': '제목을 입력하세요.'
    }, max_length=100, label="게시글 제목")
    contents = forms.CharField(error_messages={
        'required': '내용을 입력하세요.'
    }, widget=forms.Textarea, label="게시글 내용")

3. views.py 에 board_write 함수 작성

  • form 불러오기 (BoardForm)
  • 입력한 폼 함수 가져와서 (일단비어있음), form 에 담고 렌더에 전달하기
from django.shortcuts import render, redirect

from member.models import BoardMember
from .models import Board
from .forms import BoardForm

def board_write(request):
    form = BoardForm()
    return render(request, 'board_write.html', {'form':form})

4. board/urls.py 연결

from django.urls import path
from . import views

urlpatterns = [
    path('list/', views.board_list),
    path('write/', views.board_write),
]

5. 경로 들어가 확인

캡처를 하지 않았는데 제목과 내용부분을 작성할 수 있게 나와 있는데 아무래도 로그인의 html 코드를 복붙해서 넣다 보니까 forms.py 에 contents 부분의 위젯을 textarea 로 바꿔놨지만, 보여지는 모습은 textarea 가 아니다.

textarea 는 input tag 와는 완전 다른 거라서 input type 을 바꿔서 되는 것이 아니기 때문에 아예 새로운 태그를 (textarea) 만들어 보여주게끔 해야 한다.

< input type="" > 으로 시작되는 코드 위에 어떤 조건을 써 줄 것인데,

"ifequal" 을 적용해 보자.
만약 field 의 name 이 'contents' 인 경우 'textarea' 가 연결된 부분을 보여주고 아니라면 (게시글의 'title' field 에 해당), 그대로 기존 'input type' 부분을 보여주게 하는 것이다.

{% extends "base.html" %}

{% block content %}
<div class="row mt-5">
  <div class="col-12">
    <form method="POST" action=".">
      {% csrf_token %}
      {% for field in form %}
      <div class="form-group">
        <label for="{{ field.id_for_label }}">{{ field.label }}</label>
        {% ifequal field.name 'contents' %}
        <textarea
          class="form-control"
          name="{{field.name}}"
          placeholder="{{ field.label }}"
        ></textarea>

        {% else %}
        <input
          type="{{ field.field.widget.input_type }}"
          class="form-control"
          id="{{ field.id_for_label }}"
          placeholder="{{ field.label }}"
          name="{{ field.name }}"
        />
        {% endifequal %}
      </div>
      {% if field.errors %}
      <span style="color: red;">{{ field.errors }}</span>
      {% endif %}
      {% endfor %}
      <button type="submit" class="btn btn-primary">글쓰기</button>
    </form>
  </div>
</div>
{% endblock %}

board_write.html 이 완성되었다.

이제 글을 작성할 때 사용자를 넣어 줘야 하는데, 자동적으로 로그인이 된 사용자가 보이게 해야 한다.

6. views.py 에 board_write 함수 작성

board_write 함수를 마저 작성한다.
단순 글쓰기 화면을 보여주는 GET 과 폼에 데이터를 넣어 전송하는 POST 두 갈래로 분기하여 코드를 작성한다.

from django.shortcuts import render, redirect

from member.models import BoardMember
from .models import Board
from .forms import BoardForm

def board_write(request):
    if request.method == "POST":
        form = BoardForm(request.POST)

        if form.is_valid():
            # form의 모든 validators 호출 유효성 검증 수행
            # 이 부분에 session 처리 예정
            
            board = Board()
            board.title     = form.cleaned_data['title']
            board.contents  = form.cleaned_data['contents']
            # 검증에 성공한 값들은 사전타입으로 제공 (form.cleaned_data)
            # 검증에 실패시 form.error 에 오류 정보를 저장
            
            board.writer    = #이건 어디서 가져올까?
            # 로그인을 했으니 session 에서 가져온다.
            # 로그인 상태에서만 글을 작성할 수 있다.
            board.save()

            return redirect('/board/list/')

    else:
        form = BoardForm()

    return render(request, 'board_write.html', {'form':form})

다시 작성해 본다.

from django.shortcuts import render, redirect

from member.models import BoardMember
from .models import Board
from .forms import BoardForm

def board_write(request):
    if request.method == "POST":
        form = BoardForm(request.POST)

        if form.is_valid():
            # form의 모든 validators 호출 유효성 검증 수행
            user_id = request.session.get('user')
            member = BoardMember.objects.get(pk=user_id)
            
            board = Board()
            board.title     = form.cleaned_data['title']
            board.contents  = form.cleaned_data['contents']
            # 검증에 성공한 값들은 사전타입으로 제공 (form.cleaned_data)
            # 검증에 실패시 form.error 에 오류 정보를 저장
            
            board.writer    = member
            board.save()

            return redirect('/board/list/')

    else:
        form = BoardForm()

    return render(request, 'board_write.html', {'form': form})

board.save() 로 DB 에 저장을 한다. 저장이 되었을 때 어디 페이지로 이동해야 할까?
상세보기 페이지나 목록으로 리다이렉트 해야 한다,

상세보기는 만들어지지 않아 목록으로 리다이렉트 하였다.

이렇게 게시판 글쓰기도 만들어 보았다. (로그인한 사용자가 쓸 수 있다.)

profile
.

0개의 댓글