我想在幾天前回答這個問題,我用模板過濾器做了這個。我的鏈接是相對URL,不是絕對的,但你可以很容易地調整,你也可以調整正則表達式來匹配你喜歡的任何鏈接標記。
使用過濾器時,鏈接只能在顯示時查看,所以如果您的視圖的網址發生了變化,該鏈接會自動使用reverse()
查找進行更新。
我也使用Markdown來處理我的描述字段,所以我讓鏈接返回一個markdown格式的鏈接而不是HTML,但你也可以調整。如果您使用Markdown,則需要先放置此過濾器。
因此,爲了顯示與內部鏈接的描述文本字段,模板會是這樣的:(見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 2014-11-02 20:44:10
像Twitter,Instagram,Facebook和維基百科。將用戶指向其他頁面,並查看頁面上是否有其他頁面被提及。 – Jamgreen 2014-11-02 20:54:45
你爲什麼要把事情搞得如此複雜?只是使用命名的網址,你很好! – doniyor 2014-11-02 20:57:46