2011-12-19 3 views
1

У нас есть проект Django, установленный на нескольких сайтах. У пары из них также будет приложение, которое создает окно состояния, которое должно отображаться на первой странице, скажем. Каков правильный способ его отображения, если приложение будет установлено. Если приложение отсутствует, ничего не должно отображаться.Вставьте дополнительное приложение Django на другую страницу, если это приложение присутствует

Я думаю, что я мог бы сделать это, имея приложение статус продлить основной индекс страницы:

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

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

Является ли это право, идиоматическое подход? Кажется немного противоречивым, чтобы расширить всю переднюю страницу, чтобы добавить немного контента.

EDIT: Кроме того, как мне управлять тем фактом, что мое приложение захочет определить свою собственную страницу «индекс», которая должна отображаться предпочтительнее «общей страницы» по всему проекту? Я, очевидно, не хочу жестко кодировать ссылку на него в urls.py проекта. Создать ли url.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]) 

 Смежные вопросы

  • Нет связанных вопросов^_^