티스토리 뷰
[django 커뮤니티] 게시판 글쓰기 ( models.py, admin.py, views.py, forms.py, templates, html, urls.py)
지휘리릭 2020. 1. 18. 20:57● 게시판 모델링 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 %}
아래와 같은 게시물 작성 창이 나온다.
'django project > 커뮤니티' 카테고리의 다른 글
- Total
- Today
- Yesterday
- iOS 검은 화면
- django clean
- pythonanywhere배포방법
- ModelForm Form 차이
- 장고 태그달기
- python 웹 배포
- django pythoneverywhere
- django 로그인접근
- 장고 게시판
- django 개발일지
- cleaned_data
- iOS 화면 안나옴
- 까만 화면
- iOS UITableView 출력안됨
- django 태그
- 데이터베이스 추천
- iOS 데이터베이스
- Firebase 데이터베이스 추천
- django tag
- CellForRowAt 호출안됨
- django 게시판
- 테이블출력안됨
- 알파벳 카운팅
- CellForRowAt Not Called
- 웹 배포
- pythonanywhere배포
- 실시간 데이터베이스
- Django
- UITableViewController Not Working
- Realtime Database
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |