4장에서는 장고 기능 중 6개를 선별하여 각각을 선별하여 알아봅니다.
4.1 Admin 사이트 꾸미기
저자는 룩앤필(Look and Feel)이라고 표현하는 C,R,U,D의 기능을
깔끔한 UI로 제공해주는 것이 Django 의 장점이다.
4.1.1 데이터 입력 및 수정
아래의 예시 테이블인 Choice로 보면 데이터가 입력 및 수정이 매칭되어
편하게 조작 가능하도록 되어 있다.
4.1.2 필드 순서 변경
Question 테이블의 필드를 변경해보자.
# cd /polls/admin.py
from django.contrib import admin
from polls.models import Question, Choice
# Register your models here.
class QuestionAdmin(admin.ModelAdmin):
fields = ['pub_date', 'question_text'] # 필드 순서 변경
admin.site.register(Question, QuestionAdmin)
admin.site.register(Choice)
아래는 Question 필드의 화면이 바뀐 화면이다.
4.1.3 각 필드를 분리해서 보여주기
Question 테이블의 필드를 분리해서 보여주자.
# cd /polls/admin.py
from django.contrib import admin
from polls.models import Question, Choice
# Register your models here.
class QuestionAdmin(admin.ModelAdmin):
# fields = ['pub_date', 'question_text'] # 필드 순서 변경
fieldsets = [
('Question Statement', {'fields': ['question_text']}),
('Date Information', {'fields': ['pub_date']}),
]
admin.site.register(Question, QuestionAdmin)
admin.site.register(Choice)
아래는 Question 필드의 화면이 바뀐 화면이다.
4.1.4 필드 접기
Question 테이블의 필드를 접기해서 보여주자.
# cd /polls/admin.py
from django.contrib import admin
from polls.models import Question, Choice
# Register your models here.
class QuestionAdmin(admin.ModelAdmin):
# fields = ['pub_date', 'question_text'] # 필드 순서 변경
fieldsets = [ # 필드 분리 처리
('Question Statement', {'fields': ['question_text']}),
#('Date Information', {'fields': ['pub_date']}),
('Date Information', {'fields': ['pub_date'], 'classes': ['collapse']}), # collapse 처리
]
admin.site.register(Question, QuestionAdmin)
admin.site.register(Choice)
아래는 Question 필드의 화면이 바뀐 화면이다.
4.1.5 외래키 관계 화면
Question 테이블의 필드를 접기해서 보여주자.
Question 테이블과 Choice 테이블은
1:N 관계형을 가지고 있다.
1:N을 외래키 관계로 가지고 있다.
(.. 화면은 생략한다 ..)
4.1.6 Question 및 Choice를 한 화면에서 변경하기
Question 및 Choice 를 한 화면에서 수정할 수 있도록 변경해보자
# cd /polls/admin.py
from django.contrib import admin
from polls.models import Question, Choice
# Register your models here.
class ChoiceInline(admin.StackedInline):
model = Choice
extra = 2
class QuestionAdmin(admin.ModelAdmin):
# fields = ['pub_date', 'question_text'] # 필드 순서 변경
fieldsets = [
#('Question Statement', {'fields': ['question_text']}),
#('Date Information', {'fields': ['pub_date']}),
(None, {'fields': ['question_text']}),
('Date Information', {'fields': ['pub_date'], 'classes': ['collapse']}),
]
inlines = [ChoiceInline] # Choice 모델 클래스 같이 보기
admin.site.register(Question, QuestionAdmin)
admin.site.register(Choice)
아래는 Question & Choice 화면이 바뀐 화면이다.
4.1.7 테이블 형식으로 보여주기
Question 및 Choice 를 한 화면에서 수정하면서 테이블 식으로 보이도록 변경해보자
# cd /polls/admin.py
from django.contrib import admin
from polls.models import Question, Choice
# Register your models here.
#class ChoiceInline(admin.StackedInline):
class ChoiceInline(admin.TabularInline): # 테이블 형식
model = Choice
extra = 2
class QuestionAdmin(admin.ModelAdmin):
# fields = ['pub_date', 'question_text'] # 필드 순서 변경
fieldsets = [
#('Question Statement', {'fields': ['question_text']}),
#('Date Information', {'fields': ['pub_date']}),
(None, {'fields': ['question_text']}),
('Date Information', {'fields': ['pub_date'], 'classes': ['collapse']}),
]
inlines = [ChoiceInline] # Choice 모델 클래스 같이 보기
admin.site.register(Question, QuestionAdmin)
admin.site.register(Choice)
아래는 Question & Choice 화면이 바뀐 화면이다.
4.1.8 레코드 리스트 컬럼 지정하기
4.1.9 list_filter 필터
4.1.10 search_fields
1) 레코드 리스트 컬럼 보이게끔 설정,
2) 지정 필드로 화면 우측에 list_filter 필터 추가
3) 검색 박스를 추가
# cd /polls/admin.py
from django.contrib import admin
from polls.models import Question, Choice
# Register your models here.
#class ChoiceInline(admin.StackedInline):
class ChoiceInline(admin.TabularInline):
model = Choice
extra = 2
class QuestionAdmin(admin.ModelAdmin):
# fields = ['pub_date', 'question_text'] # 필드 순서 변경
fieldsets = [
('Question Statement', {'fields': ['question_text']}),
#('Date Information', {'fields': ['pub_date']}),
('Date Information', {'fields': ['pub_date'], 'classes': ['collapse']}),
]
inlines = [ChoiceInline] # Choice 모델 클래스 같이 보기
list_display = ('question_text', 'pub_date') # 1) 레코드 리스트 컬럼 지정
list_filter = ['pub_date'] # 2) 화면 우측에 DATE로 필터를 가능하게 한다.
search_fields = ['question_text'] # 3) Search 필드를 추가 한다.
admin.site.register(Question, QuestionAdmin)
admin.site.register(Choice)
아래는 바뀐 화면이다.
4.1.11 polls/admin.py 변경 내역 정리
# cd /polls/admin.py
from django.contrib import admin
from polls.models import Question, Choice
# Register your models here.
#class ChoiceInline(admin.StackedInline):
class ChoiceInline(admin.TabularInline):
model = Choice
extra = 2
class QuestionAdmin(admin.ModelAdmin):
# fields = ['pub_date', 'question_text'] # 필드 순서 변경
fieldsets = [
('Question Statement', {'fields': ['question_text']}),
#('Date Information', {'fields': ['pub_date']}),
('Date Information', {'fields': ['pub_date'], 'classes': ['collapse']}),
]
inlines = [ChoiceInline] # Choice 모델 클래스 같이 보기
list_display = ('question_text', 'pub_date') # 레코드 리스트 컬럼 지정
list_filter = ['pub_date'] # 화면 우측에 DATE로 필터를 가능하게 한다.
search_fields = ['question_text'] # Search 필드를 추가 한다.
admin.site.register(Question, QuestionAdmin)
admin.site.register(Choice)
4.1.12 Admin 사이트 템플릿 수정
# cd 프로젝트폴더/settings.py
# 위의 내용 동일
TEMPLATES = [
{
...
'DIRS': [os.path.join(BASE_DIR, 'templates')],
...
},
]
# 아래 내용 동일
# 장고의 설치 디렉토리는 아래 명령어로 확인할 수 있다.
python -C "import django; print(django.__path__)"
4.2 장고 파이썬 쉘로 데이터 조작하기
Admin 사이트를 일반적으로 사용하는 데이터 처리 외 방법으로 파이썬 쉘을 이용한다.
# 장고 파이썬 쉘 사용 방법
python manage.py shell
# shell 종료시
quit()
or
exit()
4.2.1 Create - 데이터 생성/입력
# CREATE INSERT 문
from polls.models import Question, Choice
from django.utils import timezone
q = Question(question_text="WHAT'S NEW???", pub_date=timezone.now())
q.save()
아래는 결과 화면이다.
추가된 것을 확인할 수 있다.
4.2.2 Read - 데이터 조회
4.2.3 Update - 데이터 수정
4.2.4 Delete - 데이터 삭제
동일하게 쿼리들을 사용해서 테스트 해보면 된다.
( 용이성이 높은지는 모르겠으니 그냥 PASS... 궁금하면 별도로 찾아보자..)
4.2.5 polls 애플리케이션의 데이터 실습
아래 shell로 polls 애플리케이션의 데이터를 생성 및 변경해보는 실습을 해봅니다.
# 실습
# 우리가 정의한 모델을 사용하기 위해 임포트합니다.
from polls.models import Question, Choice
# 현재 각 테이블에 들어있는 레코드를 확인합니다.
Question.objects.all()
# Admin 사이트를 설명하면서 4.1.6 절에서 입력한 Choice 레코드가 보입니다.
Choice.objects.all()
# 추가로 레코드 하나를 생성하겠습니다.
# 날짜를 입력하기 위해 timezone 모듈을 임포트합니다.
# settings.py 파일에 USE_TZ=True로 설절된 경우입니다.
# datetime.datetime.now() 보다는 timezone.now() 사용을 추천합니다.
from django.utils import timezone
q = Question(question_text="WHAT'S UP?????", pub_date=timezone.now())
# 데이터베이스에 저장을 위해 save() 함수를 호출합니다.
q.save()
# id 속성이 자동으로 생성된 것을 확인합니다.
q.id()
# 속성에 접근할 때는 파이썬 문법 그대로 '.'을 사용합니다.
q.question_text
q.pub_date
# 기존의 속성값을 변경하고 데이터베이스에 저장합니다.
q.question_text = "WHAT'S UP???!?!?!?!?"
q.save()
# 테이블의 모든 레코드를 조회합니다.
Question.objects.all()
# 만일 레코드 제목이 [<Question: Question object>] 처럼 나온다면,
# models.py 모듈에 __str__() 메소드를 확인하기 바랍니다.
# 파이썬 쉘을 빠져 나오기 위해서는, exit() 또는 Ctrl-Z(리눅스에서는 Ctrl-D)를 입력합니다.
exit()
수행 결과는 아래와 같죠.
4.3 템플릿 시스템
MVT 방식에서 UI 를 담당하는 Template 에서는 HTML 코드 + Django 코드가 섞인다.
장고의 템플릿 시스템은 템플릿 문법으로 작성된 템플릿 코드를 해석하여
템플릿 파일로 결과물을 만들어줍니다.
이렇게 템플릿 코드를 템플릿 파일로 해석하는 과정을 장고에서는 렌더링이라고 합니다.
템플릿 코드 : 렌더링 전의 템플릿 문법에 따라 작성된 파일
템플릿 파일 : 렌더링 후의 결과물인 HTML과 같은 텍스트 파일
4.3.1 템플릿 변수
템플릿 변수는 아래와 같다.
# 템플릿 변수
{{ vaiable }}
4.3.2 템플릿 필터
필터란 최종 결과를 조건부로 변경하는 것을 말한다.
장고의 템플릿 문법에서도 템플릿 변수에 필터를 적용하여 변수의 출력 결과를 변경 할수 있다.
# 템플릿 변수 필터
# name 변수값의 모든 문자를 소문자로 바꿔주는 필터
{{ name|lower }}
# text 변수값 중에서 특수 문자 이스케이프해주고, 결과에 <p> 태그 붙인다.
{{ text|escape|linebreaks }}
# bio 변수값 중에서 앞에 30개 단어만 보여주고, 줄바꿈 문자는 모두 없앤다.
{{ bio |truncatewords:30 }}
# 인자에 빈칸이 있는 경우는 따옴표로 묶는다.
# list가 만일 ['a','b','c'] 라면, "a // b // c"가 된다.
{{ list|join:" // " }}
# value 변수값이 False 이거나 없는 경우 "nothing" 으로 보여준다.
{{ value|default:"nothing" }}
# value 변수 값의 길이 반환. 리스트도 가능
{{ value|length }}
# value 변수값에서 HTML 태그 모두 없앤다. 100% 보장은 X
{{ value|striptags }}
# 복수 접미사 필터
{{ value|plurize }}
# value 변수값이 1이 아니면 복수 접미사 s를 붙여준다. 다른 복수 접미사
# es 또는 ies를 붙일 때는 필터에 인자를 사용한다.
{{ value|plualize:"es" }} or {{ value|plurize:"ies" }}
# 변수 값에 표현식 2 추가
{{ value|add:"2" }}
# 더하기
# python + django = pythondjango
# [1,2,3] + [4,5,6] = [1,2,3,4,5,6]
# "5" + "10" = 15
{{ first|add:second }}
이후 4장 까지는 실습내용이다.. 책이 있다면 책을 따라서 해보자!
'IT 툴툴' 카테고리의 다른 글
[Django파이썬웹프로그래밍] 05 실습 예제 확장하기 - 5.2~5.3 (0) | 2021.11.27 |
---|---|
[Django파이썬웹프로그래밍] 05 실습 예제 확장하기 - 5.1 (0) | 2021.11.27 |
[Django파이썬웹프로그래밍] 03 Django 웹 프레임워크 - 3.6~3.7 (0) | 2021.11.22 |
[Django파이썬웹프로그래밍] 03 Django 웹 프레임워크 - 3.4~3.5 (0) | 2021.11.22 |
[Django파이썬웹프로그래밍] 03 Django 웹 프레임워크 - 3.1~3.2 (0) | 2021.11.22 |