Vue.js를 Django 템플릿에서 사용해보자
2018-09-23
들어가며
사내에서 온보딩 과제로 실험(?)했던 내용을 기술하고자 한다. 바로 Vue.js를 Django Template과 결합하여 사용하는 것이다.
- 자바스크립트 프레임워크/라이브러리를 Webpack 빌드 하는 방법 외에는 써본 적이 없고
- Node.js(자바스크립트)의 MVC 프레임워크가 아닌 Python의 Django의 템플릿으로 작성을 해본 적도 없었다.
이런 상황에서 여러모로 도전일 수 밖에 없는 상황이었는데 결론적으로는 뭐 생각보다 그리 어렵지 않았다.
- Vue를 script로 호출 했을 때 문법과 작성방법이 크게 달라지는 것은 없었고
- Node.js Express의 ejs, jade(pug)를 사용하는 것과 DTL을 사용하는 방법 자체가 다르진 않았기 때문이다.
작성 방법
이번 포스팅은 간단하게 두 개의 포인트를 가져가고자 한다. DTL(장고 템플릿) 내에서 어떻게 Vue를 작성할 것인가? 그리고 Webpack이 아닌 Script 방식에서 컴포넌트를 만들 때 어떻게 템플릿을 구성 것인가?
1. Vue와 DTL 구분자
일단 Vue 템플릿에서는 Vue의 변수를 호출할 때
<div>{{변수명}}</div>
이렇게 작성한다. 그런데 공교롭게도 DTL에서도 장고 내의 변수를 호출할 때 같은 구분자를 가진다. 어떻게 처리해야할까?
new Vue({
delimiters: ['[[', ']]']
})
위와 같이 작성해주면 된다. 저렇게 구분이 될 뿐만 아니라 장고 변수와 Vue의 변수를 결합하여 응용이 가능해진다.
2. 장고 템플릿으로 레이아웃 구성할 때 Vue 컴포넌트 작성법
장고 템플릿으로 구성하게 될 때 각 페이지마다 Vue가 선언이 되어야하는 구조가 된다. 그렇게 되면 Vue로 공통 레이아웃을 작성할 수 없을 것만 같은 느낌적인 느낌이 들고는 하는데 역시나 간단한 해결 방법이 있다.
const mixin = {
created: function () { console.log(1) }
}
const vm = new Vue({
created: function () { console.log(2) },
mixins: [mixin]
})
// => 1
// => 2
위와 같이 mixin
기능을 사용하게 된다면 걱정 없다.
공통 레이아웃에서 new Vue
를 선언하고 mixin
을 선언하며 자식(컨텐츠가 담긴) 컴포넌트에서 mixin을 작성하면 된다.
물론 자식 컴포넌트의 스크립트가 공통 레이아웃 컴포넌트의 new Vue 선언보다 앞서 호출될 수 있도록 작성은 해야하지만 말이다.
그런 부분은 DTL의 extends와 block을 사용한다면 어떻게 작성해야할지 쉽게 이해할 수 있을 것이다.