게시물을 수정할 때는 수정 시간을 나타내는 속성이 필요하다.
예)
class Question(models.Model):
(... 생략 ...)
modify_date = models.DateTimeField(null=True, blank=True)
(... 생략 ...)
class Answer(models.Model):
(... 생략 ...)
modify_date = models.DateTimeField(null=True, blank=True)
null=True는 데이터베이스에서 modify_date 칼럼에 null을 허용한다는 뜻이다.
blank=True는 form.is_valid()를 통한 입력 데이터 검증 시 값이 없어도 된다는 의미로
null=True, blank=True는 어떤 조건으로든 값을 비워둘 수 있음을 의미한다.
수정일시는 수정한 경우에만 생성되는 데이터이므로 null=True, blank=True를 지정한다.
작성한 질문을 수정하려면 질문 상세 화면에서 수정 버튼을 클릭하여 수정 화면으로 진입해야 한다.
질문 상세 화면 html에 질문 수정 버튼을 추가한다.
수정 버튼은 로그인한 사용자와 글쓴이가 동일한 경우에만 노출되도록 다음과 같은 코드를 추가한다.
예)
{% if request.user == question.author %}
만약 로그인한 사용자와 글쓴이가 다르다면 수정 버튼은 보이지 않는다.
html 수정 다음
urls.py, views.py도 질문 수정 기능을 구현하도록 수정한다.
로그인한 사용자와 수정하려는 질문의 글쓴이가 다를 경우 '수정 권한이 없다'라는 오류 메시지를 발생시킬 수 있다.
이 오류 메시지를 발생시키기 위해서는 messages
모듈은 사용한다. messages는 장고가 제공하는 모듈로 넌필드 오류(non-field error)를 발생시킬 경우에 사용한다.
질문 상세 화면에서 수정 버튼을 클릭하면 페이지가 GET 방식으로 호출되어 질문수정 화면이 보여진다.
질문 수정화면에서 사용한 템플릿은 질문 등록시 사용했던 html 파일과 동일하다.
그리고 질문 수정 화면에서 저장하기 버튼을 클릭하면 페이지가 POST 방식으로 호출되어 데이터가 수정된다.
왜냐하면 form 태그에 action 속성이 없는 경우 디폴트 action은 현재 페이지가 되기 때문이다.
생성과 유사한 순서로 html, views.py, urls.py를 수정하며 구현해 간다.
먼저 작성한 글을 삭제할 수 있는 버튼을 생성한다.
삭제 버튼은 수정 버튼과 달리 href 속성값을 javascript:void(0)로 설정할 수 있다.
삭제 버튼을 클릭했을 때 "정말로 삭제하시겠습니까?" 와 같은 확인창을 띄우기 위해 href에 삭제 URL을 직접 사용하지 않고 위와 같은 작업을 진행할 수 있다.
검색 기능을 구현하기 위해서는
파이썬이라고 검색을 하면 파이썬 이라는 문자열이 제목, 내용, 질문 작성자, 답변, 답변 작성자에 존재하는지 찾아보고 그 결과를 화면에 보여주어야 한다.
예)
from django.db.models import Q
kw = request.GET.get('kw', '') # 검색어
if kw:
question_list = question_list.filter(
Q(subject__icontains=kw) | # 제목 검색
Q(content__icontains=kw) | # 내용 검색
Q(answer__content__icontains=kw) | # 답변 내용 검색
Q(author__username__icontains=kw) | # 질문 글쓴이 검색
Q(answer__author__username__icontains=kw) # 답변 글쓴이 검색
).distinct()
코드의 Q함수는 OR조건으로 데이터를 조회하기 위해 사용하는 함수이다. 제목과 내용 그리고 글쓴이를 OR 조건으로 검색하기 위해 사용된다. 그리고 filter 함수 뒤에 사용된 distinct는 조회 결과에 중복이 있을 경우 중복을 제거하여 리턴하는 함수이다. 하나의 질문에는 여러 개의 답변이 있을 수 있다. 이 때 여러 개의 답변이 검색 조건에 해당될 때 동일한 질문이 중복으로 조회될 수 있다. 이런 이유로 중복된 질문을 제거하기 위해 distinct가 사용된다.
검색어를 'kw'로 뱓는다고 가정하면,
kw = request.GET.get('kw', '') # 검색어
처럼 kw 값은 GET으로 읽도록 한다.
kw를 POST 방식으로 전달한다면 page 파라미터도 역시 POST방식으로 전달해야 하기 때문에 여러 파라미터를 조합하여 게시물 목록을 조회할 때는 GET 방식을 사용하는 것이 좋다.
kw와 page를 동시에 GET방식으로 호출하고 이들을 GET으로 요청할 수 있는 searchForm을 추가한다.
기존 페이징 처리하는 부분도 예)?page=1
처럼 직접 파라미터를 코딩하는 방식에서 값을 읽어 폼에 설정할 수 있도록 변경해야 한다.
이후 page, kw 파라미터를 동시에 요청할 수 있는 자바스크립트를 다음과 같이 추가하고
views.py에서 검색 함수를 수정한다.
장고의 메인 언어인 python에는 머신러닝과 관련된 여러가지 툴이 있기 때문에 장고 안에서 머신러닝 모델을 직접 이식하는 방식으로 따로 서버를 두지 않아도 장고 서버가 돌아가는 와중에 머신러닝이나 신경망을 통해 바로 예측값을 출력할 수 있다.
머신러닝의 돌아가는 과정은
1) 모델을 불러서
2) 값을 넣은 후에
3) 그것을 예측값을 받는 과정으로 이해할 수 있다.
Django REST Framework는 머신러닝 모델 배포에 사용할 수 있는 Web API 구축에 유용하게 사용될 수 있다.
Django REST 프레임워크의 도움으로 API 엔드포인트를 호출하는 것만으로 복잡한 기계 학습 모델을 쉽게 사용할 수 있다.
장고에서 머신러닝을 사용하기 위해서는
1) 장고 프로젝트 생성
2) 장고 앱 생성
3) apps.py 수정
4) views.py, urls.py 수정
5) 마이그레이션
6) 서버 실행 - 머신러닝 모델 배포 준비
7) REST API 테스트
과정을 거칠 수 있다.