Добавьте дополнительное приложение Django на другую страницу, если это приложение присутствует - PullRequest
1 голос
/ 19 декабря 2011

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

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

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

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

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

РЕДАКТИРОВАТЬ: Кроме того, как мне управлять тем, что мое приложение будет хотеть определить свою собственную «индексную» страницу, которая должна отображаться в предпочтении по сравнению с «индексной» страницей всего проекта?Я, очевидно, не хочу жестко кодировать ссылку на него в urls.py проекта.Создаю ли я специфичный для развертывания urls.py, который ссылается на конкретные приложения, установленные в этом развертывании?И если так, разве это не повторяет информацию в INSTALLED_APPS и, следовательно, нарушает DRY?

1 Ответ

2 голосов
/ 19 декабря 2011

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

Ваш базовый шаблон загружает общий тег "boxes". В источнике тега вы можете отобразить все, что захотите, основываясь на установленных приложениях для этого конкретного экземпляра. Таким образом, вы можете иметь набор приложений по умолчанию для отображения блоков, или конечный пользователь может настроить, какие приложения должны отображать блоки.

В ваших настройках, конфигурации или даже в самом теге вы можете определить шаблон для рендеринга для блока для приложения.

Предполагая, что каждое приложение имеет свои шаблоны в каталоге 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])
...