다른 처리 된 템플릿에서 템플릿을 결합하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/283300

  •  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의 템플릿으로 나사로 나사를 멈추십시오.

다른 팁

당신은 a를 사용할 수 있습니다 {% 포함 %} 꼬리표. 그러나 그것은 당신에게 많은 도움이되지 않습니다. 더 나은 해결책은 관습을 작성하는 것입니다 포함 태그 필요한 템플릿과 기능으로.

(간단한 방법으로) 여러 개의 견해를 하나에 혼합 할 수 없습니다. 예쁜 장고 솔루션 태그를 시도하십시오.

포함하려는 각 응용 프로그램에 대해 사용자 정의 템플릿 태그를 작성 하여이 작업을 수행했습니다. 처음에는 내 템플릿 태그가 방금 하드 코딩 된 HTML을 전달했습니다. 나중에 나는 태그가 자체 템플릿 조각을로드 할 수 있음을 발견했습니다. 꽤 잘 작동하는 일반적인 최신 컨텐츠 태그 인 스 니펫도있었습니다.

많은 재사용 가능한 앱 (esp. 피 낙스 프로젝트)는 사용자 정의 템플릿 태그를 사용하여 컨텐츠를 삽입하는 방법에 대한 훌륭한 예제 역할을합니다. 제임스 베넷 말하다 Djangocon 2008에서도 도움이 될 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top