[django] template context-processors를 통해 동시에 여러 템플릿에 view 적용하기

dhleeone·2022년 1월 15일
0

다른 템플릿에 상속되는 base.html에서 특정 데이터를 표시하려고 했는데 어떻게 할지 방법을 찾다가 template context-processors를 알게 되었다.

  • 먼저 manage.py 가 위치한 root 디렉토리에 'utils'라는 파이썬 패키지 폴더를 만들고, 그 안에 context_processors.py 파일을 만든다.

  • 이제 함수를 만든다.(나는 수량을 표시하는 함수를 만듬)

# utils/context_processors.py

from cart.models import *

def notification(request):
    if request.user.is_authenticated:
        current_user = request.user
        numbers = Cart.objects.filter(user_id=current_user)
        number = len(numbers)
    else:
        number = None
    return {'number': number,}

다음 settings.py에서 templates의 options안에 utils.context_processors."함수명"을 추가한다.

#settings.py

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR / 'templates'],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
           	...    
               'utils.context_processors.notification',
               ....
            ],
        },
    },
]

이제 위 함수에서 넘긴 dictionary key를 원하는 템플릿에 적용할 수 있다.



[참고]
https://blog.isaccchoi.com/programing/Template-context-processors%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%A7%88%EC%9D%8C%EB%8C%80%EB%A1%9C-%EB%A1%9C%EB%93%9C%ED%95%98%EA%B8%B0/



추가 ) 에러해결

위 프로젝트에서 로그인이 안된 상태에서는 다음과 같은 오류가 발생했었다.

그래서 아래 함수에서 request.user.is_authenticated를 통해 로그인 시에만 number 데이터를 전달하고,
아닐 시에는 number=None으로 지정하였더니 에러가 해결되었다.

# utils/context_processors.py

from cart.models import *

def notification(request):
    if request.user.is_authenticated:
        current_user = request.user
        numbers = Cart.objects.filter(user_id=current_user)
        number = len(numbers)
    else:
        number = None
    return {'number': number,}
profile
하루하루 쌓아가는 개발 지식📦

0개의 댓글