나는 페이지의 75 %가 정적 인 내용이고 나머지는 전형적인 "웹 응용 프로그램"모델에 맞는 몇백 개의 페이지가있는 사이트가 있습니다. 내가 선호하는 것은 장고 (Django) 다.Django에서 Hyde와 같은 것을 사용할 수 있습니까?
콘텐츠는 매우 맞춤법이 있습니다. 대부분의 페이지는 기본 사이트 크롬을 약간 벗어나므로 복잡한 텍스트 편집기를 사용하여 올바른 출력을 내기보다는 HTML로 작성하는 것이 더 간단합니다. 따라서 현재 진행중인 방향은 템플릿의 콘텐츠를 정의하는 것입니다. 단일보기가 있고 들어오는 경로를 템플릿 경로로 사용합니다. 이렇게하면 사이트의 각 페이지가 파일 시스템의 페이지로 유지되고 (찾기 쉽고 버전 관리에서 쉽게 추적 할 수 있음) 각 페이지가 여러 공통 요소 (예 : 머리글, 바닥 글, 탐색)를 공유하고 자체 데이터를 삽입 할 수 있습니다. 필요에 따라
많은 세부 사항에서 이러한 문제가 발생합니다. 예 :
- 다른 페이지와 페이지 데이터 공유. 예를 들어, 페이지에서 정의한 제목이 다른 페이지의 탐색 메뉴에 나타나야합니다. 템플릿에서 블록 값을 가져 오는 것에 대해 this question을 발견했지만 실제로는 복잡하고 복잡하지는 않습니다.
- 관련 문제 : 블록으로 정의한 경우 한 번만 사용할 수 있습니다. 나는 일반적으로 페이지의 여러 장소에있는 {% block title %}의 예를 보았습니다. 좋은 해결책 없이도 여러 번 그렇게했습니다.
- 다중/유연한 상속. breadcrumb 들어, 내가 페이지의 조상에서 상속하고 싶지만 레이아웃 아마 다른 뭔가 (예 : 한 열 대 두 개의 열 기본 템플릿) 상속 싶습니다.
나는 이러한 특정 문제가 주로 사용하여, 스스로 풀 수 있습니다 포함 및 사용자 정의 템플릿 태그,하지만 난 않도록하고 싶습니다 해킹, 위에 쌓여 해킹을보고 그 길을 찾고 생각 -이 매우 간단하고 쉽게 grokked 시스템이어야합니다.
이러한 문제를 조사하는 과정에서 나는 Hyde을 발견했으며 많은 문제를 해결할 것으로 보입니다. 특히 사이트 구조에 대한 감각을 가지고 페이지를 탐색 할 수있는 도구를 제공하는 것이 좋습니다.
그러나 나는 여전히 완벽하게 맞춰야하는 모든 동적 조각을 가지고 있습니다. 따라서 콘텐츠 페이지에 대한 모든 작업은 동적 응용 프로그램의 일부인 모든 서식 파일에서 실제로 사용할 수 있어야합니다. 또한 "각 페이지 템플릿"접근 방식에 대해 정말 좋아하는 한 가지는 urls.py에 경로를 추가하고 사용자 지정보기를 지정하여 특정 페이지의 처리를 변경할 수 있다는 것입니다.
이 유형의 사용 사례에 대한 좋은 해결책이 있습니까? 더 일반적으로 장고가해서는 안되는 것입니까? 그것은 나에게 내가 일종의 CMS 데이터베이스로 스케일링 문제로 이어질 가능성이 보인다 보이는 파일 시스템을 사용하려고 일종의 일이지만 Django 프로세스 및 템플릿 내용을 캐싱 꽤 잘 보인다 및 기존의 일부 CMS보고 후 솔루션 (django-cms, feincms, fibre) 나는 정적 인 내용을위한 하나의 해결책과 대화식 내용을위한 완전히 다른 아이디어를 갖고 있다는 생각을 정말로 좋아하지 않는다.
-
페이지 데이터에 대한 사전이 최상위 수준에 전달되는
- (수 있도록하는 것은 태그를 작성할 수 있습니다
편집 여기
내가 페이지 메타 데이터를 처리하기 위해 사용자 정의 태그를 사용하여/구성을 가지고 무엇을 그것은 스택에서 더 높은 다음 코드는 (
- 사용자 정의 데이터 태그 페이지
- 다른 사용자 정의 태그 읽기이 페이지 데이터에 데이터를 작성하고 구조를 렌더링 할 수 있습니다) 탐색을 다시 읽을 수로 :가
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 데이터가 대상 페이지의 데이터를 덮어 쓰지 않도록 올바른 순서로 수행해야합니다.
장고가 작동하기를 원하는 방식으로 작업하고있는 것처럼 느껴지고 내가 누락 된 이런 종류의 일을 처리 할 수있는 더 나은 방법이 있었으면합니다.
죄송합니다.이 태그에는 맞춤 태그가 잘못되었습니다. – Marcin
질문에 문제 또는 문제점을 넣으십시오. – Marcin
사용자 정의 태그를 사용할 수 있다면 기꺼이 사용할 수 있습니다. 지금까지 나는 내 결과에별로 행복하지 않다. – Adam