Я пытаюсь реализовать шаблонный фильтр WikiLink в Django, который запрашивает модель базы данных, чтобы дать разные ответы в зависимости от существования страницы, идентичные красным ссылкам Википедии. Фильтр не вызывает ошибку, но вместо этого ничего не делает для ввода.
WikiLink определяется как: [[ThisIsAWikiLink | This is the alt text]]
Вот рабочий пример, который не запрашивает базу данных:
from django import template
from django.template.defaultfilters import stringfilter
from sites.wiki.models import Page
import re
register = template.Library()
@register.filter
@stringfilter
def wikilink(value):
return re.sub(r'\[\[ ?(.*?) ?\| ?(.*?) ?\]\]', r'<a href="/Sites/wiki/\1">\2</a>', value)
wikilink.is_safe = True
Вход (value
) - это многострочная строка, содержащая HTML и множество WikiLinks.
Ожидаемый выход заменяет [[ThisIsAWikiLink | This is the alt text]]
на
<a href="/Sites/wiki/ThisIsAWikiLink">This is the alt text</a>
или , если "ThisIsAWikiLink" не существует в базе данных:
<a href="/Sites/wiki/ThisIsAWikiLink/edit" class="redlink">This is the alt text</a>
и возвращаемое значение.
Вот нерабочий код (отредактированный в ответ на комментарии / ответы):
from django import template
from django.template.defaultfilters import stringfilter
from sites.wiki.models import Page
import re
register = template.Library()
@register.filter
@stringfilter
def wikilink(value):
m = re.match(r'\[\[ ?(.*?) ?\| ?(.*?) ?\]\]', value)
if(m):
page_alias = m.group(2)
page_title = m.group(3)
try:
page = Page.objects.get(alias=page_alias)
return re.sub(r'(\[\[)(.*)\|(.*)(\]\])', r'<a href="Sites\/wiki\/\2">\3</a>', value)
except Page.DoesNotExist:
return re.sub(r'(\[\[)(.*)\|(.*)(\]\])', r'<a href="Sites\/wiki\/\2\/edit" class="redlink">\3</a>', value)
else:
return value
wikilink.is_safe = True
Код должен сделать следующее:
- извлечь все WikiLinks в значение
- запросить модель Page , чтобы узнать, существует ли страница
- заменить все вики-ссылки обычными ссылками, стилизованными в зависимости от каждого существования вики-страницы.
- возвращает измененное значение
Обновленный вопрос:
Какое регулярное выражение (метод) может возвращать список WikiLinks на python, который можно изменить и использовать для замены исходных совпадений (после изменения).
Edit:
Я бы хотел сделать что-то вроде этого:
def wikilink(value):
regex = re.magic_method(r'\[\[ ?(.*?) ?\| ?(.*?) ?\]\]', value)
foreach wikilink in regex:
alias = wikilink.group(0)
text = wikilink.group(1)
if(alias exists in Page):
regex.sub("<a href="+alias+">"+ text +"</a>")
else:
regex.sub("<a href="+alias+" class='redlink'>"+ text +"</a>")
return value