Я хотел ответить на эту же проблему всего несколько дней назад, и я сделал это с помощью фильтра шаблонов. Мои ссылки являются относительными URL-адресами, а не абсолютными, но вы можете легко отредактировать это, и вы также можете настроить шаблон регулярного выражения, чтобы он соответствовал любой разметке ссылок.
Используя фильтр, ссылка отображается только во время отображения, поэтому, если URL вашего вида изменился, это должно автоматически обновляться с помощью поиска reverse()
.
Я также использую Markdown для обработки моих полей описания, поэтому я делаю ссылку возвратной ссылкой с отформатированной в обратном порядке ссылкой вместо HTML, но вы тоже можете настроить ее. Если вы используете Markdown, вы должны сначала поместить этот фильтр.
Так, чтобы отобразить описание TextField с внутренними ссылками, в шаблоне будет что-то вроде этого: (см. В Django docs on writing your own custom filters для получения более подробной информации о написании и регистрирующих фильтров)
{{ entity.description|internal_links|markdown }}
Что касается конкретного фильтра, то я сделал следующее:
from django import template
from django.core.urlresolvers import reverse
from my.views import *
register = template.Library()
@register.filter
def internal_links(value):
"""
Takes a markdown textfield, and filters
for internal links in the format:
{{film:alien-1979}}
...where "film" is the designation for a link type (model),
and "alien-1979" is the slug for a given object
NOTE: Process BEFORE markdown, as it will resolve
to a markdown-formatted linked name:
[Alien](http://opticalpodcast.com/cinedex/film/alien-1979/)
:param value:
:return:
"""
try:
import re
pattern = '{{\S+:\S+}}'
p = re.compile(pattern)
#replace the captured pattern(s) with the markdown link
return p.sub(localurl, value)
except:
# If the link lookup fails, just display the original text
return value
def localurl(match):
string = match.group()
# Strip off the {{ and }}
string = string[2:-2]
# Separate the link type and the slug
link_type, link_slug = string.split(":")
link_view = ''
# figure out what view we need to display
# for the link type
if(link_type == 'film'):
link_view = 'film_detail'
elif(link_type == 'person'):
link_view = 'person_detail'
else:
raise Exception("Unknown link type.")
link_url = reverse(link_view, args=(link_slug,))
entity = get_object_or_404(Entity, slug=link_slug)
markdown_link = "[" + entity.name + "](" + link_url + ")"
return markdown_link
Можете ли вы дать один прецедент для вашей цели? я действительно не понимаю, зачем вам это нужно – doniyor
Как твиттер, instagram, facebook и wikipedia. Чтобы указать пользователей на другие страницы и посмотреть, упоминается ли страница где-то еще на странице. – Jamgreen
Почему вы делаете такие сложные вещи? просто используйте именованные URL-адреса, и вы в порядке! – doniyor