我正在尝试在 Django 中实现一个 WikiLink 模板过滤器,它查询数据库模型以根据页面的存在给出不同的响应,与维基百科的红色链接相同。过滤器不会引发错误,而是不对输入做任何事情。
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
输入( ) 是一个多行字符串,包含 HTML 和许多 WikiLink 。value
预期输出替换[[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模型以查看页面是否存在
- 用普通链接替换所有 WikiLink,其样式取决于每个 wikipage 的存在。
- 返回更改后的值
更新后的问题是:什么正则表达式(方法)可以返回一个 WikiLinks 的 python 列表,可以更改并用于替换原始匹配项(更改后)。
编辑:
我想做这样的事情:
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