【发布时间】:2010-10-28 11:32:26
【问题描述】:
我正在尝试在 Django 中实现一个 WikiLink 模板过滤器,该过滤器查询数据库模型以根据页面的存在给出不同的响应,与 Wikipedia 的红色链接相同。过滤器不会引发错误,而是不对输入做任何事情。
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 和许多 WikiLink。
预期的输出将[[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>
和返回值。
这是无效的代码(根据 cmets/answers 编辑):
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
代码需要做的是:
- 提取 value 中的所有 WikiLink
- 查询 Page 模型以查看页面是否存在
- 用普通链接替换所有 WikiLink,其样式取决于每个 wiki 页面的存在。
- 返回改变后的值
更新后的问题是: 什么正则表达式(方法)可以返回一个 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
【问题讨论】:
-
“它不工作”不是很有帮助。它在做什么?预期的输出是什么?
-
您可能需要将
^ $包裹在您的正则表达式周围。 -
-1:问题中缺少错误或错误结果。
-
针对 cmets 更新的问题
-
我编辑了我的答案并添加了一个使用 re.sub 和回调的解决方案。它通过字符串实现你想要的。
标签: python regex django django-templates