[Django] Kickoff day2
Django Kickoff day1 -> 링크
1일차에 이어 2일차 시작합니다 ~
3. 장고 shell
#장고 쉘 실행
python manage.py shell
#장고 쉘 종료
exit()
장고 쉘에서는 파이썬의 명령어를 사용해 데이터를 읽고 필터를 걸거나 정렬을 할 수 있다.
# 모델 임포트
>>> from polls.models import Choice, Question
# 모든 객체 출력
>>> Question.objects.all()
# 장고유틸에서 타임존 임포트
>>> from django.utils import timezone
# 객체 지정 (질문1번 생성)
>>> q = Question(question_text="What's new?", pub_date=timezone.now())
# 데이터베이스에 객체 저장
>>> q.save()
3-1. 객체 생성
>>> q = Question(question_text="What's new?", pub_date=timezone.now())
>>> q.save()
객체 q를 지정하면 id가 1인 데이터가 생긴다. 데이터베이스에 저장하기 위해서 q.save() 를 꼭 실행한다.
>>> q.question_text = "What's up?"
>>> q.save()
위와 같이 속성의 값을 변경할 수 있다. 변경 후엔 데이터베이스에 저장하는 과정을 거친다.
>>> Question.objects.creat(question_text="What's wrong?", pub_date=timezone.now())
위와 같은 방법으로 객체를 생성하는 것도 가능하다.
3-2. 객체 출력 (정렬, 필터)
객체를 보다 직관적으로 볼 수 있도록 __str__
메소드를 모델에 추가한다. 리턴값을 객체의 속성값 중 고를 수 있는데 진행중인 튜토리얼에선 question_text
로 정의했다.
>>> Question.objects.all()
#<QuerySet [<Question: What's up?>]>
쿼리셋이 Question모델의 question_text
속성을 출력한다. 쿼리셋은 단순한 데이터의 조회뿐만 아니라 데이터를 정렬하고 필터할 수도 있다.
>>> Question.objects.filter(id=1)
>>> Question.objects.filter(question_text__startswith='What')
>>> Question.objects.get(pub_date__year=current_year)
>>> Question.objects.order_by('pub_date')
중간과정은 생략하고 객체를 정렬하거나 필터링하는 코드만 나열해보았다.
참고사항
get
은 리턴하는 데이터가 1개일 때Question.objects.get(id=1)
filter
은 리턴하는 데이터가 2개 이상일 때Question.objects.filter( 생략 )
3-3. 연결 데이터 생성
>>> q = Question.objects.get(pk=1)
# 객체 q와 연결된 데이터를 생성한다.
>>> q.choice_set.create(choice_text='Not much', votes=0)
>>> q.choice_set.all()
# <QuerySet [<Choice: Not much>]>
>>> q.choice_set.count()
데이터베이스의 테이블 간 상호관계를 갖는 속성들을 생성하거나 조회할 수 있다. Pk가 1인 객체 q의 데이터와 연결되어 생성된 값은 Fk(question_id)=1 이 된다.
4. 관리자 생성
장고는 사이트 관리자를 위한 모델에 대한 관리용 인터페이스를 모두 자동으로 생성한다.
python manage.py createsuperuser
위의 명령을 실행하고 Username
과 Email address
, Password
를 입력하면 웹페이지 관리사이트에 로그인 할 수 있는 사용자가 생성된다.
관리 사이트는 따로 생성해주어야한다. 앱 디렉토리 내부에 있는 admin.py
파일에 아래의 코드를 추가한다.
# models모듈의 Question클래스 임포트
from .models import Question
# 관리사이트 목록에 Question 추가
admin.site.register(Question)
짜잔 ~! 데이터 추가, 수정, 저장, 삭제 모두 가능하다
5. 템플릿
템플릿파일 경로
polls/templates/polls/파일명.html
장고는
templates
하위 app이름의 디렉토리를 찾기 때문에 이 경로를 사용한다.
이번 튜토리얼에서 템플릿은 간단하게 짚고만 넘어간다.
6. 뷰
url mapping을 통해 urls모듈과 views모듈이 연결된다. (위의 뷰는 템플릿과 연결이 안되어있지만 이후엔 템플릿과도 연결이 된다.)
6-1. shortcuts
render
render는 템플릿에 context를 채워넣고 HttpResponse 객체와 함께 돌려주는 기능을 한다.render의 인수로 request
, template address
, context
가 들어간다.
render를 사용하면 loader
와 HttpResponse
는 생략할 수 있다.
get_object_or_404()
get_object_or_404
와 get_list_or_404()
는 객체가 존재하지 않을 때 예외를 발생시켜 오류를 출력한다. 즉, views모듈에서 try&except
구문을 간단하게 표현한다. 두 함수가 다른 점은 반환하는 리턴하는 객체값의 갯수이다.
6-2. namespace
장고가 프로젝트 내 많은 앱이 갖고 있는 URL을 어떻게 구별할까? 최상위 디렉토리의 URLconf에 namespace
를 추가해 앱의 이름공간을 설정할 수 있다.
namespace
를 설정한 이 후엔 템플릿 안 html파일에서 url을 이렇게 표현할 수 있다.
<!--a태그의 href속성-->
{% url 'polls:index question.id %}
7. 기타
제너릭 뷰
장고는 웹 페이지에서 잦은 빈도로 구현하는 기능인 detail
과 result
의 뷰 모듈을 생성하는 '제너릭 뷰
시스템'이라는 지름길을 제공한다. 제너릭 뷰는 일반적인 패턴을 추상화하여 앱을 작성하기 때문에 파이썬 코드를 작성하지 않아도 된다.
detail
뷰가 구현하는 주된 기능은 출력하고자 하는 Question 데터의 id값을 받아서 질문 내용을 표시하는 것이다. 이처럼 뻔한(?) 기능을 장고가 대신 코드도 써주고 나대신 열일해준다.. (감사) (위의 사진은 views모듈에서 생성한 detail함수 대신 제너릭 뷰의 Detailview 클래스로 변경한 것)
views모듈을 제너릭 뷰 시스템으로 변경하고 URLconf를 수정해준다. path
함수의 인수를 route는 <int:pk>/의 형태로, view모듈의 detail함수 대신 Detailview클래스로 수정한다.
다른 view모듈의 함수도 제너릭 뷰를 사용해 간단하게 표현할 수 있다. 제너릭 뷰 시스템을 사용할 땐 각 제너릭 뷰에 어떤 모델이 적용이 될 것인지 정확하게 알아야한다.
🛠 마무리
장고가 웹 페이지를 구성하는 일련의 흐름을 간단하게 정리해보겠다.
출처 유튜브 장고개념정리
1
클라이언트가 전송한 url 주소를 검사
2
URLconf가 매핑을 통해 해당하는 앱의 url로 전송
3
url 에서 해당하는 view로 이동
4
view 와 연결된 model의 데이터를 template로 전송
5
클라이언트에게 template을 출력
Author And Source
이 문제에 관하여([Django] Kickoff day2), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@e2joo418/Django-Kickoff-day2저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)