2011-12-19 2 views
1

여러 사이트에 Django 프로젝트가 설치되어 있습니다. 그 중 두 사람에게는 첫 페이지에 표시해야하는 상태 상자를 생성하는 앱도 있습니다. 앱을 설치하는 경우 앱을 표시하는 올바른 방법은 무엇입니까? 앱이없는 경우 아무것도 표시되지 않아야합니다.Django 응용 프로그램을 다른 페이지에 추가 (해당 응용 프로그램이있는 경우)

가 나는 상태 앱이 기본 색인 페이지 확장함으로써 그것을 할 수 있다고 생각 :

{% extends "mainproject/index.html" %} 

{% block statusboxplaceholder %} 
<div> status here </div> 
{% endblock %} 

는 오른쪽 관용적 접근 방식인가? 약간의 내용을 추가하기 위해 전체 프론트 페이지를 확장하는 것은 약간 직관력이없는 것처럼 보입니다.

EDIT : 또한 내 앱에서 자체 "인덱스"페이지를 정의하려고 할 때 어떻게 관리해야합니까? 프로젝트 전체의 "인덱스"페이지보다 우선적으로 표시되어야합니까? 난 분명히 프로젝트의 urls.py에서 그것에 대한 참조를 하드 코딩하고 싶지 않다. 해당 배포에 설치된 특정 응용 프로그램을 나타내는 배포 관련 urls.py를 만듭니다. 그렇다면 INSTALLED_APPS의 정보를 반복하여 DRY를 위반하지 않는 것입니까?

답변

2

나는 당신의 접근 방식에 문제가 보이지 않지만 일반적인 템플릿 태그가 가장 유연한 기능을 제공한다고 생각합니다. 특히이 기능을 나중에 설치할 수있는 다른 응용 프로그램으로 확장하려는 경우 더욱 그렇습니다.

기본 템플릿에 일반 "상자"태그가로드됩니다. 그러면 태그의 소스에서 특정 인스턴스에 대해 설치된 앱을 기반으로 원하는 것을 렌더링 할 수 있습니다. 따라서 상자 렌더링을위한 일련의 기본 응용 프로그램을 만들거나 최종 사용자는 렌더링 할 상자가있는 응용 프로그램을 사용자 지정할 수 있습니다.

설정, 구성 또는 태그 자체에서 앱별로 블록에 렌더링 할 템플릿을 식별 할 수 있습니다. 각 응용 프로그램은 app/templates 디렉토리의 템플릿을 가지고 있다고 가정

-이 사이비은 (이 안된) 당신이 가야한다 :

from django.conf import settings 
from django import template 
register = template.Library() 

class GenericBox(template.Node): 
    def __init__(self, app): 
     self.app = app 
    def render(self, context): 
     if self.app not in settings.INSTALLED_APPS: 
     return '' # if the app is not installed 
     # Here you would probably do a lookup against 
     # django.settings or some other lookup to find out which 
     # template to load based on the app. 
     t = template.loader.get_template('some_template.html') # (or load from var) 
     c = template.RequestContext(context,{'var':'value'}) # optional 
     return t.render(c)  

@register.tag(name='custom_box', takes_context=True, context_class=RequestContext) 
def box(parser, token): 
    parts = token.split_contents() 
    if len(parts) != 2: 
     parts[1] = 'default_app' # is the default app that will be rendered. 
    return GenericBox(parts[1]) 
관련 문제