#python #django #django-templates
#python #django #django-шаблоны
Вопрос:
Я работаю над проектом django, и у меня есть модель, в которой есть список things
. По всему сайту у меня может быть неструктурированный текст, введенный в других моделях. При отображении страницы я хотел бы проанализировать неструктурированный текст на предмет любой ссылки thing.slug
и включить ссылку на thing.get_absolute_url
.
Я бы предположил, что приложение должно состоять из пользовательского тега templatetag, который анализирует object.text
, который использует что-то вроде анализатора регулярных выражений для сопоставления любых thing.slug
терминов из словаря all things
.
Возьмем, к примеру:
У меня есть thingA и ThingB, но хотелось бы thingC.
Будет изменен на:
I have <a href="/things/a">thingA</a> and <a href="/things/b">thingB</a>, but would like <a href="/things/c">thingC</a>.
Если есть приложение django, которое уже делает это, отлично! В противном случае приветствуются любые советы о том, как лучше всего это сделать. Я также поддерживаю другие предложения, такие как jquery, хотя я не так хорошо знаком с ним.
Комментарии:
1. Как происходит точное сопоставление? Вы говорите
thingA
, что должны быть преобразованы в/things/a
, но должныthingamajiggy
быть преобразованы вthing/amajiggy
? Это camelCase, так чтоthingThatIWant
становится/things/that/i/want
?2. Если вы знакомы с django, в моей модели есть поля для
title
иslug
, поэтому пуля будет соответствовать urlpattern .3. @erikankrom: это помогло бы обновить ваш вопрос, точно показывая, как
thingamajiggy
иthingThatIWant
что следует обрабатывать. Это также помогает включить соответствующие части вашей модели в вопрос.
Ответ №1:
urls = dict((thing.slug, thing.get_absolute_url) for thing in things)
for word in object.text.split():
if word in urls:
result.append('<a href="' urls[words] '">' word '</a> ')
else
result.append(word ' ')
Комментарии:
1. Мне нравится этот метод. В модели post_save я могу разобрать object.text в object.html , вероятно, через сельдерей.
Ответ №2:
Модуль re имеет функцию sub (), которая предназначена для такого поиска и замены.
Найдите шаблон, который отличает «вещи» от остального неструктурированного текста, и создайте соответствующую строку подстановки:
>>> import re
>>> s = 'I have thing.slug and thing.foo, but would like thing.foo'
>>> re.sub(r'(w ).(w )', r'<a href="/1/2">1.2</a>', s)
'I have <a href="/thing/slug">thing.slug</a> and <a href="/thing/foo">thing.foo</a>, but would like <a href="/thing/foo">thing.foo</a>'
Это более надежно (менее подвержено ошибкам), если вы делаете шаблон для «вещей» более четким:
>>> s = 'I have {thing.slug} and {thing.foo}, but would like {thing.foo}'
>>> re.sub(r'{(w ).(w )}', r'<a href="/1/2">1.2</a>', s)
'I have <a href="/thing/slug">thing.slug</a> and <a href="/thing/foo">thing.foo</a>, but would like <a href="/thing/foo">thing.foo</a>'