""" 위의 코드 일부 생략.. """
<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>
두 세 차례 과정을 거친 뒤 다시 수정할 예정
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="게시글 내용")
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})
from django.urls import path
from . import views
urlpatterns = [
path('list/', views.board_list),
path('write/', views.board_write),
]
캡처를 하지 않았는데 제목과 내용부분을 작성할 수 있게 나와 있는데 아무래도 로그인의 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 이 완성되었다.
이제 글을 작성할 때 사용자를 넣어 줘야 하는데, 자동적으로 로그인이 된 사용자가 보이게 해야 한다.
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 에 저장을 한다. 저장이 되었을 때 어디 페이지로 이동해야 할까?
상세보기 페이지나 목록으로 리다이렉트 해야 한다,
상세보기는 만들어지지 않아 목록으로 리다이렉트 하였다.
이렇게 게시판 글쓰기도 만들어 보았다. (로그인한 사용자가 쓸 수 있다.)