IT

PYTHON Django에서 업로드된 Template(.html file)으로 동적 구현

紫紅 2019. 6. 5. 19:08
반응형

HTML파일(django template 문법 포함)을 업로드하고, 해당 파일을 상황에 맞게 include하여, 렌더링하는 기능을 만들고 있었다.
정말 하루종일 삽질했는데, settings.py 설정을 잘 해주어야 했기 때문.. 그 외에 템플릿에서의 구현도 기존 미디어 파일들과 다르니, 끝까지 읽길 권장한다.
그렇기 때문에 오랜만에 포스트를 남겨본다.

1. settings

# settings.py
import os

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

여기까지는 django 개발을 조금이라도 해본 사람이라면, 많이 접했을 것이다. 그 밑에 코드가 중요한데 잘 봐주시길..

# settings.py

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',

        # 이 부분에 수정이 필요함. MEDIA_ROOT를 추가해주는 것이 포인트이다.
        'DIRS': [os.path.join(BASE_DIR, 'templates'), MEDIA_ROOT],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.template.context_processors.media',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

이 설정을 해주지 않는다면, MEDIA_ROOT의 템플릿에 접근하질 못한다.

2. models (큰 특이사항 없음)

#models.py
from django.db import models


class Layout(models.Model):
    id = models.AutoField(auto_created=True, primary_key=True, editable=False)
    title = models.CharField(max_length=255, null=False, blank=False, unique=True)
    file = models.FileField(null=False, blank=False, upload_to='layouts')
    created_at = models.DateTimeField(auto_now_add=True, verbose_name='생성된 날짜')
    updated_at = models.DateTimeField(auto_now=True, verbose_name='수정된 날짜')

처음에 안 될 때에는 모델부터 시작해서 스토리지도 바꿔보고, chmod 755로 권한도 바꿔보고, 내가 상상할 수 있는 지랄이란 지랄은 다 해봤다.
근데 셋팅만 잘 설정해주면 쉽게 해결할 수 있는 문제였다...
모델은 평범하게 설정해줘도 된다. 심플하게...

3. template

<!--*.html-->
    {% include layout.file %}

보통 이미지 렌더링 등의 작업엔 layout.file.url까지 타이핑하는데, 이는 include시엔 잘못된 방법. file(models.FileField)까지만 쳐주는 게 포인트이다.

반응형