본문 바로가기

Study/django

django 기초 - bootstrap을 이용한 사이트 만들기 : 6. 게시판 글 등록

 - 게시판에서 newBtn 버튼을 누르면 게시글 작성 페이지로 이동

 - 게시글을 작성하고 submit 버튼을 누르면 게시글이 데이터베이스(model)에 저장

 - 작성 완료되면 다시 게시판 목록으로 돌아옴

 - 저장된 글을 게시판 목록에 띄우는건 다음 글로

 

0. DB 테이블 생성 (models 클래스 정의)

 - 작성된 게시글을 저장할 데이터 베이스 테이블을 정의

 - models(클래스 정의) - > admin(클래스 등록) -> makemigrations, migrate  순으로 진행

 - 깜빡하고 게시판 만들다가 되돌아왔다...

 

# models.py
class Bbs(models.Model):
    title = models.CharField(max_length=30)
    writer = models.CharField(max_length=30)
    content = models.TextField()
    regdate = models.DateTimeField(default=timezone.now)
    viewcnt = models.IntegerField(default = 0)

# admin.py
admin.site.register(Bbs)

 

 - TextField : 본문이 들어갈 수 있는 긴 내용의 글

 - regdate : 작성 일자 - 기본값을 timezone.now로 설정하여 글이 작성된 시간으로 설정

 - viewcnt : 조회수 - 기본값: 0 게시글을 확인할 때마다 조회수가 + 1

 ** default 옵션은 DBMS 에서 SQL문으로 테이블을 정의할때 default 옵션과 같다.

1. newBtn -> 게시글 작성 페이지 Render

<button id='newBtn'>New Board</button>
<script>
$(document).ready(function(){
	$('#newBtn').click(function(){
    	//alert('clicked')
		location.href = '../bbs_register_form/' ;
	})
})

</script>

 

 - <a> , <form> 태그 없는 버튼에 script를 사용해서 url과 연결시켜줄 수 있다.

 - alert()구문을 사용하면 버튼이 눌렸을때 메시지창을 띄울 수 있다. -> 디버깅 !

 - script문에서 서버와의 통신은 location으로 가능하다.

 

# urls.py
path('bbs_register_form/', views.bbs_register_form, name='bbs_register_form' ),

# views.py
def list(request):
    context = {
        'session_user_name': request.session['user_name'],
        'session_user_id': request.session['user_id']
    }
    return render(request, 'bbs/list.html', context)
    
def bbs_register_form(request):
    context = {
        'session_user_name': request.session['user_name'],
        'session_user_id': request.session['user_id']
    }
    return render(request, 'bbs/bbsRegisterForm.html', context)

 

 - django의 특성상 새로운 페이지를 render 할 때마다 세션 데이터를 지속적으로 입력해줘야한다.

 - 사용자 데이터를 입력해주지 않으면 header와 footer를 포함한 html문서에서 세션데이터를 사용하지 못한다.

 - 전체 게시물 출력화면과 게시물 작성 화면 모두에 context로 유저 정보를 넘겨주었다.

 

세션 데이터(context)를 입력해주지 않으면 사용자 데이터를 사용할 수 없다(이름 부분)

2. 데이터가 입력될 게시글 작성 페이지 

<form role="form" method="post" action="{% url 'bbs_request_register'}">
   {% csrf_token %}
   
   <div> ...
   			<input type="text"
				name='title' class="form-control" placeholder="Enter Title">
                
            	<input type="text"
				name="writer" class="form-control" readonly value="{{session_user_name}}">
   </div>

 

 - 게시글의 각 필드( 제목, 내용, 작성자 ) 가 입력으로 들어온다.

 - 게시 내용은 <form> 태그로 묶여 POST방식으로 서버와 통신한다.

 - 작성자는 접속한 사용자의 이름이 자동으로 입력되고 수정을 불허하기 위해 readonly 속성을 추가한다.

 - action 방식에 템플릿 메소드를 사용했다. 템플릿 메소드의 이름이 ulrs.py에 먼저 등록되어 있어야한다.

 

3. urls, views 백엔드 작성

# urls.py
    path('bbs_request_register', views.bbs_request_register , name='bbs_request_register'),

# views.py
def bbs_request_register(request):
    if request.method == 'POST':
        print(' --- bbs_request_register posted -----')
        title = request.POST['title']
        content = request.POST['content']
        writer = request.POST['writer']
        print(' ----- contetnt param : ', title, content, writer)
        orm_obj = Bbs(title=title, content= content, writer = writer).save()
        
        return redirect('list')

 

 - registerFrom.html 로부터 입력받은 데이터를 처리한다.

 - 여기서는 POST 요청으로부터 입력받은 데이터를 데이터베이스 모델에 입력하고 저장하면 된다.

 - save() 는 DBMS의 commit()과 같다. 작성하지 않으면 최종적으로 데이터가 입력되지 않는다. 깜빡하지말자 ! 

 

 - admin에 접속하면 입력된 데이터를 확인 가능하다.

 - 데이터베이스에 저장된 게시물 항목을 게시판에 띄우는 것은 다음 글에 작성 !