전 시간에 했던 Django shell에서 연습했던 QuerySetAPI를 직접 view 함수에 사용해보자.
Create Read Update Delete 의 과정이 중요하다는 사실이 한 번 더 강조하며 들어가보겠다.


처음 index 함수를 본다면 html 파일에 변수를 보내기 위해 context를 render에 인자로 담았고 딕셔너리의 형태로 변수를 가져온다. 그 때 articles에 Article.objects.all()으로 전체 게시글을 들고왔다.
이후, html 파일에서는 DTL인 반복문을 활용하여 각 인스턴스의 속성까지도 접근할 수 있음을 확인할 수 있다.



단일 게시글을 확인하기 위해서는 URL주소부터 variable routing을 통해 작성됨을 확인할 수 있고, 연쇄적으로 detail 함수에서는 두번째 인자로 pk값으로 받아온다. 이 pk 값은 고유값이므로 단 하나의 인스턴스만을 조회하였고 이를 html파일에 렌더링하였음을 확인할 수 있다.




코드들을 쭉 나열해봤는데 그 의미를 자세히 한 번 들여다보자. 결국 코드들을 손으로 쳐보는 것이 제일 중요하고 그 다음은 코드를 보고 어떤 의미를 가지는 지, 어떤 결과를 내는지 유추하고 확인하는 과정이 중요하기 때문에 차근차근 들여다보자.
먼저 URL은 2가지가 필요할 것이다. 첫째는 생성하는 입력창(new.html), 둘째는 생성이 완료된 이후 보여줄 창(create.html). 물론 생성이 완료된 이후 바로 index페이지를 보여주면 되지 않나 라고 생각이 들 수 있고, 그는 좀있다 등장할 direct를 배운 후에 구현할 수 있다.
다음 View 또한 2가지가 필요할 것이다. 첫째는 생성이라는 버튼을 눌렀을 때 생성하는 form을 보여줄 함수(views.new), 둘째는 사용자가 입력한 내용을 DB에 저장하는 함수(views.create).
new 함수 -> new.html -> create함수 -> create.html 순으로 로직이 진행되니 연결하여 보자.
views.new
new라는 요청을 받으면 new.html이라는 페이지를 렌더링 해줌
new.html
사용자에게 입력받을 form을 작성 -> action : 작성하면 create.html로 보낼 것이다, method : 입력받을 내용을 DB에 create할 것이므로 GET이 아닌 POST 요청으로 보내야한다.
-> csrf 토큰 : POST방식으로 요청이 들어오면 사용자가 DB에 영향을 주는 것은 사실 예민한 문제일 수 있다. 그래서 보안상의 문제로 POST 요청인 경우 반드시 csrf토큰과 함께 보내는 과정이 필요하다.
views.create
입력 받았으니 create url -> create 함수로 왔을 것이다. 이때, form에 입력한 내용들이 request.POST에 담겨서 오게 된다. 이를 인스턴스를 생성하고 속성에 넣어 DB에 저장하게 된다. -> 이후 create.html 페이지를 렌더링 해준다.
의 순서로 진행되니 천천히 한 번 다시 읽어보자.
Client가 인자에 작성된 주소로 다시 요청을 보내도록 하는 함수
위의 코드처럼 사용하는데 이는 인스턴스를 저장한 이후 detail 페이지로 다시 요청을 보내도록한다. detail은 인스턴스의 pk 값도 인자로 필요하기 때문에 같이 적어준 것이다.



View 파트에 집중하여 본다면, DB에서의 삭제할 인스턴스를 pk로 조회하여 가져온 다음 delete() 메서드로 삭제한 후 메인화면으로 redirect 시키는 것을 확인할 수 있다.
마찬가지로 POST에는 csrf토큰이 따라오는 것도 확인할 수 있다.
수정은 코드를 보기 전에 먼저 생각을 해보자. 삭제처럼 우리가 수정할 인스턴스의 pk를 통해 조회한 다음 그들의 속성들을 덮어씌워주고 저장하면 될 것 같다는 생각이 든다. 물론 Update에도 2가지의 함수가 필요할 것이다. 첫째 조회하여 수정하는 화면 반환(edit), 둘째 수정한 결과 DB에 저장 및 메인페이지로 돌아가기(update). 코드를 보며 이해해보자.




여기까지가 edit에 대한 코드로, html 파일에 대한 설명만 조금 추가하자면, 빨간 박스 친 부분은 우리가 수정을 할 때, create와 구분하기 위해 수정할 파일의 원본을 띄워주는 역할을 한다.


