22 окт. 2009 г.

TEMPLATE_CONTEXT_PROCESSORS наследование шаблонов для нескольких сайтов

Очень просто и очень глупо, оказывается, можно было решить мою давнишнюю проблему с наследованием шаблонов в многодоменном  django-проекте.

У меня есть сетка сайтов одной и той же фирмы с разным дизайном, но примерно одинаковым контентом. Для каждого сайта есть базовый шаблон base.html в котором прописаны стили, индивидуальная верстка, общие блоки и пр.

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


def listing_and_path(request):

    ...

    rhost = request.get_host().strip('w.')

    ...

    try:

        profile = SiteProfile.objects.get(site__domain=rhost)

    except:

        profile = False

    base_tamplate = u'%s/base.html'%rhost

    return {

            'pages': Page.objects.filter(sites__domain=rhost, state='published').order_by('position'),

             ...

            'profile': profile,

            'base_tamplate':base_tamplate,

    }


Как и все приличные контекстные процессоры, данная функция подключена в settings.py:


TEMPLATE_CONTEXT_PROCESSORS = (

    "django.core.context_processors.auth",

    "django.core.context_processors.debug",

    "django.core.context_processors.i18n",

    "django.core.context_processors.media",

    "django.core.context_processors.request",

    "realtor.views.listing_and_path",

)


В шаблоне наследнике или в общем шаблоне используется конструкция вида:


{% extends base_template %}


Вещи, вроде бы, очевидные, но у меня до недавнего времени были полные копии веток шаблонов, в которых отличались только


{% extends '72arenda.ru/base.thml' %}



# или 



{% extends 'realtor-tyumen.ru/base.thml' %}


- что, как вы понимаете, клиника.

5 комментариев:

Igor Kramer комментирует...

Спасибо за интересный метод.
Я для решения такой задачи написал свой template loader, который брал шаблоны из необходимой директории.

Ivan Markeev комментирует...

А где можно посмотреть этот template loader?

Igor Kramer комментирует...

Моего сейчас нет под рукой, могу только вечером его выложить.
Но я делал на основе template loader'а из Byteflow: http://byteflow.su/browser/apps/lib/template_loaders.py
Текущий сайт определяется через SiteIDHook(), который я тоже увидел в Byteflow (http://byteflow.su/browser/apps/lib/threadlocals.py)

vden комментирует...

Да здравствует еще более легкий способ построения дорвеев! ;)

Ivan Markeev комментирует...

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