티스토리 뷰

● 게시판 모델링 models.py

 

    - 게시글의 작성자는 사용자 모델에서 가져오는 것이므로 Foreign Key를 사용한다. 한 명의 작성자가 여러 개의 게시글을 작성할 수 있기 때문에 일대다 (1:N) 관계를 갖는다. 

    -  on_delete = models.CASCADE : 사용자가 탈퇴하거나 사라지면 해당 사용자가 작성한 글들도 함께 사라지게 된다. 

from django.db import models

class Board(models.Model):
    title = models.CharField(max_length=64, verbose_name="제목")
    contents = models.TextField(verbose_name="내용")
    registered_date = models.DateTimeField(auto_now_add=True, verbose_name = "등록 시간")
    writer = models.ForeignKey('users.Users', verbose_name = "작성자", on_delete = models.CASCADE)

    def __str__(self):
        return self.title
    
    class Meta:
        db_table = "community_board"
        verbose_name = "게시물"
        verbose_name_plural = "게시물"

 

 

 

게시판 admin.py

  admin 화면에서 게시판 목록은 제목과 작성자가 나타나도록 한다.

from django.contrib import admin
from .models import Board

class BoardAdmin(admin.ModelAdmin):
    list_display = ('title', 'writer', )

admin.site.register(Board, BoardAdmin)

 

 

 

게시판 forms.py

게시글을 작성할 때, 제목과 내용을 입력하게 한다.

from django import forms

class BoardForm(forms.Form):
    title = forms.CharField(error_messages = {'required':"제목을 입력해주세요"}, label = "제목", max_length=128)
    contents = forms.CharField(error_messages = {'required':"내용을 입력해주세요."}, label = "내용", widget = forms.Textarea)

 

 

 

 

게시판 views.py

    - 세션에 저장되어있는 user 즉, 로그인 되어있지 않다면 login 페이지로 이동하도록 한다. 

 

    -  페이지 요청 정보가 GET 인 경우 (그냥 페이지를 나타내는 경우)에는, 게시판 작성 폼을 띄우기만 한다. 그리고 게시글 작성 버튼을 누른 경우 ( 페이지 요청 정보가 POST인 경우)에는, 폼이 유효한지 확인한 후에 세션에 저장되어 있는 아이디 정보(user_id)를 가져온다. user_id와 User 모델에 있는 id와 비교하여 (User 모델에서 기본키(pk)는 user_id이다.) 같은 값을 갖는 사용자 정보를 user에 저장한다. 이러한 이유로 Board 모델에서 작성자 필드에서 외래키를 사용하는 것이다.  가져온 사용자 정보를 작성자에 넣고, 제목, 내용을 게시판 모델(Board)에 저장하고 DB에 저장한다. 

def board_write(request):
    if not request.session.get('user'):
        return redirect('/users/login')

    if request.method == "GET":
        form = BoardForm()

    elif request.method == "POST":
        form = BoardForm(request.POST)
        if form.is_valid():
            user_id = request.session.get('user')
            user = Users.objects.get(pk = user_id)
            new_board = Board(
                title = form.cleaned_data['title'],
                contents = form.cleaned_data['contents'],
                writer = user
            )
            new_board.save()
            return redirect('/board/list')

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

 

 

 

 게시판 board_write.html

    - 로그인 폼과 마찬가지로 필드 각각의 라벨, 타입에 맞게 표시한다. 다만, 제목 작성자 등은 input type이지만, 내용은 textarea 이므로 구분해야한다.

    - 대부분의 코드가 로그인 폼과 겹치므로 설명 생략... 파일 업로드할 ㅜㅅ 있는 기능? 자바스크립트? 제공해주는 무슨 사이트가 있는데 까먹었다. 혹시 알게된다면, 나중에 추가하겠습니다.

{% extends 'base.html' %}
{% block contents %}

<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>
                {{ field.field.widget.name }}

                {% 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" style = "float:right;">글쓰기</button>
            <button type ="button" class = "btn btn-primary" style = "float:left;" onclick = "location.href ='/board/list/'">돌아가기</button>
        </form>
    </div>
</div>

{% endblock %}

 

아래와 같은 게시물 작성 창이 나온다.

board_write.html

댓글