Модель блока простая, указывать не буду.
Чтобы было понятнее, логика обратная следующей
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. Может я просмотрел, и джанго может сама выполнять данную работу на уровне базы?
Комментариев нет:
Отправить комментарий