다른 처리 된 템플릿에서 템플릿을 결합하는 방법은 무엇입니까?
-
08-07-2019 - |
문제
App1, App2, App3 등 여러 앱이 포함 된 Django Project Pro1이 있습니다. 각 앱의 블록이 포함 된 상단 레벨 템플릿을 표시하고 싶습니다.
example_base_template.html :
[header /]
[left nav bar]{{ app1 rendered template }}[/left nav bar]
[right nav bar]{{ app2 rendered template }}[/right nav bar]
[center section]{{ app1 main functionality template }}[/center section]
[footer]{{ app3 rendered template }}{{ app4 rendered template }}[/footer]
DB를 사용하는 모든 앱 템플릿은 동적입니다. 가장 적절하고 우아한 방법으로 어떻게해야합니까? 아니면 질문은 4 개의 다른 뷰를 하나의 URL에 연결하는 방법일까요?
해결책
우리는 이와 비슷한 문제가 있었고 열쇠는 컨텍스트에 올바른 데이터를 얻는 것입니다. 우리가 한 일은 각보기에 대한 데이터 생성/컨텍스트 채우기를 별도의 빌드 텍스트 루틴으로 브레이크 아웃하는 것입니다. 원래보기는 해당 루틴을 호출 한 다음 템플릿을 렌더링합니다. 복합보기는 각 컨텍스트 빌더를 호출 한 다음 마스터 템플릿을 렌더링 한 다음 하위 테드 플레이트를 포함합니다.
이곳에서 우리는 Django 템플릿 시스템에서 약간의 문제를 해결했습니다. 우리는 캐싱 템플릿 조각 이었고이 조각들 중 일부는 생성하기에 매우 비싼 데이터를 가져 왔습니다. 조각이 부실하지 않은 경우, 우리는 분명히 일을하고 싶지 않았습니다. 그러나 우리가 필요하다는 것을 알 때까지 작업을 지연시키는 것은 우리가 지금 템플릿에 있다는 것을 의미했습니다.
- 템플릿 내에서 매개 변수를 메소드로 전달할 수는 없습니다.
- django.template .__ init __. variable._resolve_lookup () 메소드는 호출 가능을 통과하면 호출하지 않을 것입니다! 컨텍스트에서 객체의 메소드를 참조하면 잘 작동합니다.
일을 해야하는 콜블 가능성이 필요한 이유는 카레 기능을 전달할 수 있기 때문입니다. 즉, 이미 일부 (또는 전부)가 지정된 기능이지만 아직 호출되지 않았습니다. 따라서보기 (또는 케이스의 컨텍스트 빌드)는 템플릿이 있도록 완전 지정 된 기능 (템플릿 자체의 매개 변수를 전달할 수 없습니다)을 카레를 만들 수 있어야합니다. 필요할 때 호출 가능을 호출하고 데이터를 얻을 수 있습니다.
우리는 이것에 대해 두 가지 별도의 접근 방식을 취했습니다.
- 우리는 사용했습니다 djangosnippets.org에서 expr 템플릿 태그
- 우리는 Django 템플릿 코드를 해킹하여 Callables를 작동 시켰습니다 (제출되었지만 아직 처리되지 않은 패치를 사용하지 않았습니다).
우리 가이 사이트를 수행 한 이후로 나는 생성기를 지연된 데이터 생산자로 사용하여 그것을 해결할 수 있다는 것을 배웠다. 발전기는 일종의 카레 기능 (설정에 대한 임의의 매개 변수를 전달할 수 있다는 점에서)과 비슷하지만 템플릿 엔진은 다른 반복자로 본다. 이있다 훌륭한 튜토리얼 이 주제에 대해. 참고 : 발전기는 배열이 아니며 한 번만 소비 할 수 있으므로 일부 논리를 조정해야 할 수도 있습니다.
다음에 나는 우리가 함께 갈 것이라고 생각합니다 Jinja2 템플릿 그리고 Django의 템플릿으로 나사로 나사를 멈추십시오.
다른 팁
포함하려는 각 응용 프로그램에 대해 사용자 정의 템플릿 태그를 작성 하여이 작업을 수행했습니다. 처음에는 내 템플릿 태그가 방금 하드 코딩 된 HTML을 전달했습니다. 나중에 나는 태그가 자체 템플릿 조각을로드 할 수 있음을 발견했습니다. 꽤 잘 작동하는 일반적인 최신 컨텐츠 태그 인 스 니펫도있었습니다.