2013-10-22 2 views
5

나는 이런 식으로 막연하게 위젯 뭔가를 정의하려면 : 그 내용은 (바람직하게는 어떤 방법으로 매개 변수화) 무엇 즉jinja2에서 재사용 가능한 위젯을 어떻게 만들 수 있습니까?

{% block css %} 
.mywidget { 
    css: goes_here; 
{% endblock %} 

{% block widget %} 
<div class="mywidget"> 
    <!-- structure goes here --> 
</div> 
{% endblock %} 

{% block script %} 
$(".mywidget").addFunctionality(stuff) 
{% endblock %} 

, 위젯의 요구를 CSS 무엇의 감속을, 어떤 스크립트가 필요 파일의 끝에. 그런 다음 레이아웃 템플릿을 확장하고 본문에 위젯을 추가하고 (여러 매개 변수가있는 동일한 유형의 여러 위젯 일 가능성이 있음) CSS 및 자바 스크립트를 상단 및 하단에 올바르게 추가 할 수 있기를 바랍니다. 레이아웃 템플릿, 위젯 유형 당 한 번.

이것은 매우 깨끗하고 직선적 인 디자인처럼 보이며 기본 UI 디자인 관점에서 비롯된 것입니다. 왜 이와 같은 작업을 수행 할 수있는 방법을 찾을 수 없는지 혼란 스럽습니다.

답변

8

당신은 위젯 시스템을위한 디자인의 일부를 구체화했지만 실제로 위젯을 디자인하는 방법을 보여 주었을뿐입니다. 다른 부분은 Jinja에서 위젯을 사용하는 방법입니다.

예를 들어 Jinja Macros을 사용하여 위젯을 정의 할 수 있습니다. 이 위젯을 사용하여 HTML에서, 그리고 파일 "mywidget.html"사용 ...

{% macro css() -%} 
    .mywidget { 
     css: goes_here; 
    } 
{% endmacro %} 

{% macro widget() -%} 
    <div class="mywidget"> 
     <!-- structure goes here --> 
    </div> 
{% endmacro %} 

{% macro script() -%} 
    $(".mywidget").addFunctionality(stuff) 
{% endmacro %} 

만들기, 당신은 물론

{% import 'mywidget.html' as mywidget %} 

... 
<html> 
<head> 
    <style> 
     {{ mywidget.css() }} 
    </style> 
<head> 
<body> 
    {{ mywidget.body() }} 

    <script> 
     {{ mywidget.script() }} 
    </script> 
</body> 
</html> 

... 할 수있는, 여기에 문제가 있다는 것입니다 모든 위젯을 수동으로 다양한 영역에 넣어야합니다. 더 많은 수의 위젯을 얻으면이를 추적하기가 어려울 수 있습니다. 예를 들어 mywidget.script() 코드를 여러 번 만들어서 쉽게 이벤트 화재가 발생할 수 있습니다.

그리고 최종 솔루션을 렌더링하는 컨텍스트의 일부로 항상 파이썬 개체를 가질 수 있습니다. 중요한 것은 Jinja가 템플릿에서 텍스트를 렌더링한다는 것입니다. 템플릿은 HTML 템플릿 일 필요조차 없습니다. Jinja를 사용하여 일반 텍스트 전자 메일을 렌더링 할 수 있습니다. 그러므로 이런 종류의 "위젯 (widget)"시스템을 만들고 모든 사람이 그 결과에 만족할 것으로 기대하는 도서관의 저자를 상상하는 것은 어려울 것입니다. 왜 Jinja가 이러한 프레임 워크를 이미 구축 할 수있는 도구를 제공했기 때문에 지원해야 할 복잡한 기능으로 라이브러리의 복잡성을 증가시킬 수 있습니까?

관련 문제