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