IT 툴툴

[Django파이썬웹프로그래밍] 04 Django의 핵심 기능 - 4.1~4.3

은듄 2021. 11. 22. 08:35
반응형

 

4장에서는 장고 기능 중 6개를 선별하여 각각을 선별하여 알아봅니다.

 


4.1 Admin 사이트 꾸미기


저자는 룩앤필(Look and Feel)이라고 표현하는 C,R,U,D의 기능을

 

깔끔한 UI로 제공해주는 것이 Django 의 장점이다.

 

 

4.1.1 데이터 입력 및 수정

 

아래의 예시 테이블인 Choice로 보면 데이터가 입력 및 수정이 매칭되어 

 

편하게 조작 가능하도록 되어 있다.

[그림04_01] Choice 테이블 Class View와 Template 일치 여부

 

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 필드의 화면이 바뀐 화면이다.

[그림04_02] 필드 순서가 바뀐 화면

 

 

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 필드의 화면이 바뀐 화면이다.

[그림04_03] 필드가 분리된 화면

 

 

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 필드의 화면이 바뀐 화면이다.

[그림04_04] 필드 중 Date Information이 접기된 화면

 

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 화면이 바뀐 화면이다.

[그림04_05] 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 화면이 바뀐 화면이다.

 

[그림04_06] 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)

 

아래는 바뀐 화면이다.

 

[그림04_07] 일괄 수정 화면

 

 

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 - 데이터 생성/입력

 

[그림04_08] 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()

아래는 결과 화면이다.

추가된 것을 확인할 수 있다.

[그림04_09] CREATE 결과 화면

 

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()

수행 결과는 아래와 같죠.

[그림04_10] 결과 입니다.

 


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장 까지는 실습내용이다.. 책이 있다면 책을 따라서 해보자!

반응형