서평 작성 파트의 첫번째 단계에서 장고 모델로 서평 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) 실행 화면
'프로젝트 > [Web] 서평 작성 사이트' 카테고리의 다른 글
프론트와 연결하기 (2) - Axios 활용 (0) | 2022.01.25 |
---|---|
프론트와 연결하기 (1) - 장고/리액트 연동 (0) | 2022.01.18 |
서평 작성 (3) - 서평 상세보기 (0) | 2022.01.14 |
서평 작성 (1) - 서평 DB 만들고 목록 조회하기 (0) | 2022.01.10 |
프로젝트 참여 시작 (0) | 2022.01.03 |