2012-01-06 3 views
1

나는 페이지의 75 %가 정적 인 내용이고 나머지는 전형적인 "웹 응용 프로그램"모델에 맞는 몇백 개의 페이지가있는 사이트가 있습니다. 내가 선호하는 것은 장고 (Django) 다.Django에서 Hyde와 같은 것을 사용할 수 있습니까?

콘텐츠는 매우 맞춤법이 있습니다. 대부분의 페이지는 기본 사이트 크롬을 약간 벗어나므로 복잡한 텍스트 편집기를 사용하여 올바른 출력을 내기보다는 HTML로 작성하는 것이 더 간단합니다. 따라서 현재 진행중인 방향은 템플릿의 콘텐츠를 정의하는 것입니다. 단일보기가 있고 들어오는 경로를 템플릿 경로로 사용합니다. 이렇게하면 사이트의 각 페이지가 파일 시스템의 페이지로 유지되고 (찾기 쉽고 버전 관리에서 쉽게 추적 할 수 있음) 각 페이지가 여러 공통 요소 (예 : 머리글, 바닥 글, 탐색)를 공유하고 자체 데이터를 삽입 할 수 있습니다. 필요에 따라

많은 세부 사항에서 이러한 문제가 발생합니다. 예 :

  • 다른 페이지와 페이지 데이터 공유. 예를 들어, 페이지에서 정의한 제목이 다른 페이지의 탐색 메뉴에 나타나야합니다. 템플릿에서 블록 값을 가져 오는 것에 대해 this question을 발견했지만 실제로는 복잡하고 복잡하지는 않습니다.
  • 관련 문제 : 블록으로 정의한 경우 한 번만 사용할 수 있습니다. 나는 일반적으로 페이지의 여러 장소에있는 {% block title %}의 예를 보았습니다. 좋은 해결책 없이도 여러 번 그렇게했습니다.
  • 다중/유연한 상속. breadcrumb 들어, 내가 페이지의 조상에서 상속하고 싶지만 레이아웃 아마 다른 뭔가 (예 : 한 열 대 두 개의 열 기본 템플릿) 상속 싶습니다.

나는 이러한 특정 문제가 주로 사용하여, 스스로 풀 수 있습니다 포함 및 사용자 정의 템플릿 태그,하지만 난 않도록하고 싶습니다 해킹, 위에 쌓여 해킹을보고 그 길을 찾고 생각 -이 매우 간단하고 쉽게 grokked 시스템이어야합니다.

이러한 문제를 조사하는 과정에서 나는 Hyde을 발견했으며 많은 문제를 해결할 것으로 보입니다. 특히 사이트 구조에 대한 감각을 가지고 페이지를 탐색 할 수있는 도구를 제공하는 것이 좋습니다.

그러나 나는 여전히 완벽하게 맞춰야하는 모든 동적 조각을 가지고 있습니다. 따라서 콘텐츠 페이지에 대한 모든 작업은 동적 응용 프로그램의 일부인 모든 서식 파일에서 실제로 사용할 수 있어야합니다. 또한 "각 페이지 템플릿"접근 방식에 대해 정말 좋아하는 한 가지는 urls.py에 경로를 추가하고 사용자 지정보기를 지정하여 특정 페이지의 처리를 변경할 수 있다는 것입니다.

이 유형의 사용 사례에 대한 좋은 해결책이 있습니까? 더 일반적으로 장고가해서는 안되는 것입니까? 그것은 나에게 내가 일종의 CMS 데이터베이스로 스케일링 문제로 이어질 가능성이 보인다 보이는 파일 시스템을 사용하려고 일종의 일이지만 Django 프로세스 및 템플릿 내용을 캐싱 꽤 잘 보인다 및 기존의 일부 CMS보고 후 솔루션 (django-cms, feincms, fibre) 나는 정적 인 내용을위한 하나의 해결책과 대화식 내용을위한 완전히 다른 아이디어를 갖고 있다는 생각을 정말로 좋아하지 않는다.

    페이지 데이터에 대한 사전이 최상위 수준에 전달되는
  1. (수 있도록하는 것은 태그를 작성할 수 있습니다

    편집 여기

    내가 페이지 메타 데이터를 처리하기 위해 사용자 정의 태그를 사용하여/구성을 가지고 무엇을 그것은 스택에서 더 높은 다음 코드는 (

  2. 사용자 정의 데이터 태그 페이지
  3. 다른 사용자 정의 태그 읽기이 페이지 데이터에 데이터를 작성하고 구조를 렌더링 할 수 있습니다) 탐색을 다시 읽을 수로

    :

    class PageInfoNode(Node): 
    
        def __init__(self, page_info): 
         self.title = page_info['title'] 
         self.breadcrumb_title = page_info.get('breadcrumb_title', self.title) 
         self.show_breadcrumb = page_info.get('show_breadcrumb', False) 
         self.nav_title = page_info.get('nav_title', self.breadcrumb_title) 
         self.side_nav = page_info.get('side_nav', None) 
    
        def render(self, context): 
         # 'page_info' must be set someplace higher in the context stack 
         page_info = context['page_info'] 
         page_info['title'] = self.title 
         page_info['nav_title'] = self.nav_title 
         if self.show_breadcrumb: 
          if 'breadcrumb' in page_info: 
           page_info['breadcrumb'] = [self.breadcrumb_title] + page_info['breadcrumb'] 
          else: 
           page_info['breadcrumb'] = [self.breadcrumb_title] 
         if self.side_nav != None: 
          page_info['side_nav'] = self.side_nav 
         return '' 
    
    @register.tag 
    def pageinfo(parser, token): 
        nodelist = parser.parse(('endpageinfo',)) 
        parser.delete_first_token() 
        return PageInfoNode(json.loads(nodelist.render(Context()))) 
    

    각 페이지와 같은 데이터를 설정 데이터

주요 부분의 이동 경로 등) 전역 딕셔너리에 JSON으로 기록 된 데이터를 읽을 태그() 인

{% block data %} 
{{ block.super }} 
{% load my_page_tags %} 
{% pageinfo %} 
{ 
    "title": "My Page Title", 
    "show_breadcrumb": true, 
    "side_nav": ["/section1/page.html", "/section2/page.html"] 
} 
{% endpageinfo %} 
{% endblock data %} 

이 작동하지만, 정말 불투명하고 깨지기 쉬운 것 같다 다음 글로브

  • al dict는 어떻게 든 추가해야합니다. 지금은보기에서 처리하지만 사용자 정의 컨텍스트 프로세서가 더 좋을 것 같습니다.
  • 실제로 상주 할 수 있도록 상속 된 블록에 있어야합니다.
  • 때로는 슈퍼의 데이터가 필요합니다 (예 : 빵 부스러기의 경우) {{block.super}}를 호출해야하지만 super 데이터가 대상 페이지의 데이터를 덮어 쓰지 않도록 올바른 순서로 수행해야합니다.

장고가 작동하기를 원하는 방식으로 작업하고있는 것처럼 느껴지고 내가 누락 된 이런 종류의 일을 처리 할 수있는 더 나은 방법이 있었으면합니다.

+1

죄송합니다.이 태그에는 맞춤 태그가 잘못되었습니다. – Marcin

+0

질문에 문제 또는 문제점을 넣으십시오. – Marcin

+0

사용자 정의 태그를 사용할 수 있다면 기꺼이 사용할 수 있습니다. 지금까지 나는 내 결과에별로 행복하지 않다. – Adam

답변

0

하나의 해결 방법은 정적 사이트 + 서비스 모델을 사용하는 것입니다. hyde를 사용하여 정적 사이트를 생성하지만 클라이언트 사이트의 javascript와 서버의 멋진 REST API를 사용하여 동적 컨텐츠를 처리하십시오.

+0

그게 훨씬 더 큰 솔루션 IMO - devs는 하이드와 자바 모두를 알아야 할 것입니다. 제 경험에서 볼 때 자바 스크립트 툴은 개발을 쉽게한다는 측면에서 실제로 존재하지 않습니다. 나는 이것을 잠시 동안 지속될 수있는 해결책으로 팔아야한다. – Adam

2

템플릿에서 데이터 만들기를 중지하십시오. 귀하의 견해에 그것을 작성하여 템플릿에 전달하십시오. 예를 들어 탐색 경로를 사용하면 이동 경로에 추가 할 코드가 템플릿에 있어야합니다. 컨텍스트 프로세서가 될 수도 있고 더 나은 관점에서 살 수도 있습니다.