9 декабря 2008 г.

Создание блочной структуры, выборка блока по маске в зависимости от текущего url в django

Для реализации структуры статических блоков, содержание которых хранится в базе данных, а вывод регулируется в зависимости от текущего url надо, чтобы наш url входил в регулярное выражение для данного блока.
Модель блока простая, указывать не буду.

Чтобы было понятнее, логика обратная следующей

Block.objects.get(path_mask__contains='url')

Здесь идет поиск по полю path_mask, содержащему 'url'.
Нам же надо найти объект, для которого значение 'url', содежит path_mask.

Код для регистрации inclusion_tag

import re

@register.inclusion_tag("show_block.html")
def show_left_blocks(url):
blocks = Block.objects.filter(column="left", active=True)
blocks_out = []
for block in blocks:
path_r=re.compile(block.path_mask)#создаем регулярное выражение
if path_r.search(url): #ищем в строке url совпадение
blocks_out.append(block) #если есть совпадение - добавляем блок
return {'blocks': blocks_out}


Минусы:
-приходится запрашивать все блоки, поиск идет на уровне приложения а не базы
(в принципе не особо критично, т.к. блоков даже в крупных проектах не сотни тысяч)

ps. Может я просмотрел, и джанго может сама выполнять данную работу на уровне базы?

Комментариев нет:

Отправить комментарий