이 글은 [파이썬 웹 프로그래밍](저자 김석훈, 출판사 한빛미디어) 교재를 보고 공부하며 정리한 글임.
4.1 Admin 사이트 꾸미기
장고의 Admin 기능
-> 데이터 관리가 쉽고 정돈된 룩앤필
Admin 를 통해 데이터의 CRUD 기능을 익혀보기
일단 runserver를 작동시킨다
웹브라우저를 통해 Admin 사이트에 접속해보자
(Admin 사이트가 죄다 깨져서 나와서 한참 오류를 구글링 했는데 DEBUG = False로 해두고 하면 그럴 수 있다고 해서 True 로 바꾸고 하니 다시 잘 나온다
참고
https://stackoverflow.com/questions/59688135/css-static-file-is-not-loading-in-django
4.1.1 데이터 입력 및 수정
만들어 놓은 Question 테이블에 데이터를 입력하거나 수정할 수 있다.
models.py 파일에 정의했던 필드 타입에 따라서 적합한 UI를 보여준다.
이것저것 눌러보고 수정해보면서 기능을 익혔다.
4.1.2 필드 순서 변경하기
테이블 보여주는 UI 양식을 변경하고 싶다면 polls/admin.py 파일을 변경하자
예를 들어 지금은
이렇게 Question text 다음에 Date published 가 온다면 이 순서를 바꾸고 싶다.
ModelAdmin 클래스를 상속받아 만든 QuestionAdmin 클래스이다.
필드의 순서를 원래랑 다르게 해서
아래에 admin 사이트에 등록하는 부분에서 Question 옆에 추가해주었다.
그러면 이렇게 순서를 바꿀 수 있다.
4.1.3 각 필드 분리해서 보여주기
필드를 분리해서 보이고 싶으면 admin.py를 다르게 수정해보자
fields를 fieldsets 로 바꾸어 구성을 다르게 해보았다.
이렇게 구분되어 보여지게 된다. 더 깔끔해 보이려면 이것도 좋은 방법 같다.
4.1.4 필드 접기
필드 개수가 엄청 많아지면 접는 기능을 추가할 수도 있다.
위와 같이 'classes' : ['collapse'] 만 추가해주면 된다.
접는 기능이 추가되었다.
4.1.5 외래키 관계 화면
Question 모델 클래스와 Choice 모델 클래스는 1:다 관계이다
Question 하나에 선택지가 여러개 달리는 거기 때문에..
따라서 Choice를 add 하려면 Question 를 선택하고 choice 입력하고, Quesiton 선택하고 choice 입력하고를 반복해야함.
번거롭다!
4.1.6 Question 및 Choice 를 한 화면에서 변경
polls/admin.py 파일을 다음과 같이 수정
ChoiceInline 클래스를 추가해주었다.(StackedInline)
extra는 Choice text의 개수를 몇 개까지 보여줄 건지 정하는 것.
Question 어디에 사나요? 를 클릭했을 때 Choice도 한번에 같이 한 화면에서 입력할 수 있게 되었다.
4.1.7 테이블 형식으로 보여주기
admin.py 에 TabularInline으로 바꾸어 주면 테이블 형식으로 보여질 수 있음.
4.1.8 레코드 리스트 컬럼 지정하기
테이블명(Question)을 클릭하면 레코드 리스트(어디에 사나요? 등)를 볼 수 있는데
models.py에서 __str__()메소드의 리턴값을 레코드 제목으로 사용하는게 디폴트 이기 때문.
Question 테이블 클릭했을 때 pub_date이랑 question_text가 같이 나오게 하고 filter 사이드 바를 추가했다.
4.1.10 search_fields
검색 박스를 만들어 보자
4.1.12 Admin 사이트 템플릿 수정
Admin 사이트의 템플릿 파일을 변경하면 Admin 사이트의 모양을 개발자의 취향에 맞게 수정가능
4.2 장고 파이썬 쉘로 데이터 조작하기
복잡한 데이터 처리를 하거나 웹 브라우저로 따로 접속하지 않을 경우에는 쉘로 데이터를 처리함.
4.2.1 Create - 데이터 생성/입력
테이블에 레코드를 생성하려면
필드값을 지정하고 객체를 생성한 후에 save() 메소드를 호출하면 된다.
(SQL 용어의 INSERT 문장을 실행)
새로운 레코드가 생겼음을 볼 수 있다.
4.2.2 Read - 데이터 조회
데이터베이스에서 데이터를 조회하려면 QuerySet 객체를 사용.
QuerySet은 데이터베이스 테이블로부터 꺼내온 객체들의 콜렉션.
필터를 사용해서 조건에 맞는 레코드만 추출한다.
QuerySet은 SQL 용어로 SELECT 문장에 해당
필터는 WHERE 절에 해당
QuerySet 얻으려면 objects 객체 사용
Question의 모든 레코드 들을 조회
모든 레코드 말고 조건에 맞는 레코드들만 조회할 수도 있다. ->filter()와 exclude() 메소드 사용
한개의 요소일때엔 get() 메소드를 사용, 한 개의 객체를 가져오는 거임
또한 슬라이싱 문법이 있음 (SQL 용어로 OFFSET, LIMIT 절에 해당) -> 리스트를 반환
4.2.3 Update - 데이터 수정
객체의 필드값 수정하고 save() 메소드 호출 -> SQL 용어로 UPDATE 절에 해당
pk=1 인 레코드는 '취미가 뭔가요?' 였는데 이걸 q라고 하고
내가 q의 question_text를 'What is your favorite hobby?'로 수정해주었다.
그리고 save() 해주기.
q를 조회해보면 제대로 바뀐 걸 볼 수 있다.
여러 객체를 한번에 바꿀때에는 update() 메소드를 이용한다.
4.2.4 Delete - 데이터 삭제
객체 삭제할땐 delete() 메소드 사용 -> SQU 용어로 DELETE 절에 해당
ex)
Question.objects.filter(pub_date__year=2020).delete() #2020년에 생긴 객체들을 지우고 싶을때
Question.objects.all().delete() #이건 다 지울때
4.2.5 polls 애플리케이션의 데이터 실습
그냥 Question과 Choice의 레코드 들을 조회해보고
Question에 새로운 레코드 생성, 그 레코드를 수정해본다
id를 이용해 조회해본다
pk를 이용해 조회해본다
pk는 Primary Key 로 흔히 사용하는 조회 명령
id랑 동일하다
지금 좀 엉뚱하게 몇살인가요 라는 질문에 Seoul Japan China라는 choice들을 만들긴 했지만 ㅋㅋㅋ
아무튼 하나의 question에는 choice_set이 매칭이 된다.
그래서 지금 답변 항목을 3개 만들어 준것임,
밑줄 2개 __ 를 사용해서 객체간의 관계 나타낼 수 있음
ex)
Choice.objects.filter(question__pub_date__year=current_year)
choice_set 중에 하나 삭제하기.
Admin도 편하지만 장고 파이썬 쉘을 통해 데이터베이스 처리에 대한 기본기를 익혀보자.
데이터에 접근할 때에는 장고 파이썬 쉘을 쓰기를 권장한다고 한다.