ウィキペディアの赤いリンクと同じように、ページの存在に応じて異なる応答を返すようにデータベース モデルをクエリする WikiLink テンプレート フィルターを Django に実装しようとしています。フィルターはエラーを発生させませんが、代わりに入力に対して何もしません。
ウィキリンクは次のように定義されています。[[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
コードで行う必要があるのは次のとおりです。
- 値内のすべてのウィキリンクを抽出する
- Pageモデルにクエリを実行して、ページが存在するかどうかを確認します
- すべてのウィキリンクを通常のリンクに置き換え、各ウィキページの存在に応じてスタイルを設定します。
- 変更された値を返す
更新された質問は次のとおりです。どの正規表現 (メソッド) が python WikiLinks のリストを返すことができますか?これは変更され、元の一致を置き換えるために使用できます (変更された後)。
編集:
私はこのようなことをしたいと思います:
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