我正在开发一个django项目,并且拥有一个包含things
列表的模型。在整个网站中,我可能会在其他模型中输入非结构化文本。在显示页面时,我想解析非结构化文本,以获取对thing.slug
的任何引用,并包含指向thing.get_absolute_url
的链接。
我认为应用程序需要包含一个自定义模板标签,它解析object.text
,它使用类似正则表达式解析器的东西来匹配所有{{1}字典中的任何thing.slug
个术语}}
以例如:
我有东西A和东西B,但是想要东西C.
将修改为:
things
如果有一个django应用已经做到了这一点,太棒了!否则,任何有关如何最好地完成此任务的建议表示赞赏。即使我对它不熟悉,我也会接受其他建议,比如jquery。
答案 0 :(得分:1)
urls = dict((thing.slug, thing.get_absolute_url) for thing in things)
for word in object.text.split():
if word in urls:
result.append('<a href="'+urls[words]+'">'+word+'</a> ')
else
result.append(word+' ')
答案 1 :(得分:1)
re 模块有一个 sub()函数,专为此类搜索和替换而设计。
搜索将“事物”与非结构化文本的其余部分区分开并构造相应替换字符串的模式:
>>> import re
>>> s = 'I have thing.slug and thing.foo, but would like thing.foo'
>>> re.sub(r'(\w+)\.(\w+)', r'<a href="/\1/\2">\1.\2</a>', s)
'I have <a href="/thing/slug">thing.slug</a> and <a href="/thing/foo">thing.foo</a>, but would like <a href="/thing/foo">thing.foo</a>'
这更可靠(不易出错)是让“事物”的模式更具特色:
>>> s = 'I have {thing.slug} and {thing.foo}, but would like {thing.foo}'
>>> re.sub(r'{(\w+)\.(\w+)}', r'<a href="/\1/\2">\1.\2</a>', s)
'I have <a href="/thing/slug">thing.slug</a> and <a href="/thing/foo">thing.foo</a>, but would like <a href="/thing/foo">thing.foo</a>'