프로젝트/[Web] 서평 작성 사이트

서평 작성 (2) - 서평 쓰고 조회하기

sollllllll 2022. 1. 12. 20:27

서평 작성 파트의 첫번째 단계에서 장고 모델로 서평 DB를 만든 후

그 DB 안의 서평들을 웹페이지에서 조회하는 기능까지 구현했다.

 

이번엔 그 다음 단계로 작성한 서평을 DB에 등록하도록 하는 기능을 구현했다.

웹페이지에서 서평을 쓴 후 그 내용을 서평 DB에 넣고 전체 목록으로 조회하는 기능이다.

 

 

 

(1) 서평 목록을 조회하는 페이지에 글쓰기 페이지로 이동할 수 있는 요소를 추가한다.

파일 > templates/review/list.html

...
<a href="/review/write/">글쓰기</a>
...

 

 

(2) urls.py 파일에 write 페이지와 관련된 내용을 추가한다.

파일 > review/urls.py

urlpatterns = [
    ...
    path('write/', views.write, name='write'),
    ...
]

urls.py 파일에 해당 내용을 추가함으로써 'http://기본주소/review/write' 주소가 요청되었을 때,

views.py 파일의 write 함수를 호출하게 된다.

 

 

 

(3) views.py 파일에 write 함수를 추가한다.

파일 > review/views.py

def write(request):
    user = User.objects.get(userId='002')
    context = {'user':user}
    if request.method == 'POST':
        Review.objects.create(
            userId = user,
            bookId = request.POST['bid'],
            reviewId = request.POST['rid'],
            reviewTxt = request.POST['review']
        )
        return redirect('list')
    return render(request, 'review/write.html', context)

url 이 호출되면 views.py 파일의 write 함수가 호출된다.

그럼 먼저 글을 작성한 유저가 누구인지 정보를 얻어서 user 변수에 저장하고,

(이는 로그인 기능과 연결되어야 가능한 부분이므로 지금은 임의로 유저 한 명을 지정했다.)

글쓰기 페이지에서 작성한 내용으로 서평 DB에 데이터를 추가한 후 전체 목록을 보는 list url 을 호출한다.

 

이 때, 맨 처음에 글쓰기의 url 을 요청했을 때는 아무런 정보가 없기 때문에 (작성한 내용이 없기 때문에)

조건문을 통해 요청한 메소드가 POST 인지를 판별하도록 했다.

만약 내용이 없다면 유저 정보만 가지고 write.html 를 띄운다.

 

 

 

(4) templates 폴더에 write.html 파일을 작성한다.

파일 > templates/review/write.html

...
<form action="{% url 'write' %}" method="POST">
	{% csrf_token %}
	<div>
	    uid: {{ user.userName }}<br>
	    bookId: <input type="text" name="bid"/><br>
	    reviewId: <input type="text" name="rid"/><br>
	    서평 내용 <br>
	    <textarea name="review", rows="10", cols="40"></textarea><br>
	    <button type="submit">등록</button>
	</div>
</form>
...

write.html 이 띄워지면 요소들을 통해 서평DB에 데이터를 추가하기 위해 필요한 요소들과 서평 내용을 입력할 수 있고,

(최종적으로는 userId, bookId, reviewId 가 자동으로 채워지도록 구현할 예정이다.)

textarea 태그에 서평 내용을 작성한 후 등록 버튼을 누르면

서평 데이터를 가지고 write url 을 다시 호출시켜 views.py 파일의 write 함수로 이동해 데이터를 저장한다.

 

이 때 {% csrf_token %} 부분은 CSRF 공격을 막기 위한 것으로,

csrf_token 태그를 추가함으로써 우리 사이트가 아닌 다른 사이트에서 요청을 보내면 오류 페이지를 띄우며 거부한다.



 

(5) 실행 화면

 

글쓰기 페이지

 

서평 목록 조회 페이지