9 декабря 2008 г.

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

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

Чтобы было понятнее, логика обратная следующей
  1. Block.objects.get(path_mask__contains='url')  

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

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


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

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

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

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