在django中,在TextField中,我们如何替换,
[vimeo 123456]
与
<iframe src="http://player.vimeo.com/video/123456" width="400" height="225" frameborder="0"></iframe>
谢谢。
答案 0 :(得分:1)
我不认为在TextField
中使用HTML是个好主意。首先,它会使编辑成为一种痛苦(你必须编写代码来翻译,这将比前进更难);第二,它会浪费磁盘在数据库中存储大量的HTML;最后,它会使以后修复错误变得更加困难(例如,如果Vimeo更改了它们的URL格式)。
我可以看到两个选项:
在您的视图功能中执行此转换。您的视图函数将具有如下行:
context["commentText"] = process_markup(thePost.commentText)
然后,在您的模板文件中,您需要将该字段标记为safe
,因为您已经过滤了它:
{{ commentText|safe }}
在自定义过滤器标记中执行此转换,例如restructuredtext
中的django.contrib.markup
过滤器。这是sebpiq推荐的,可能是更好的选择。
from django.template.defaultfilters import stringfilter
import re
@stringfilter
def mymarkup(value):
return process_markup(value)
然后,在您的模板文件中,您需要调用过滤器:
{{ commentText|mymarkup }}
在这两种情况下,您都需要编写process_markup(value)
,其外观如下:
import re
_TAGS = [
# First, escape anything that might be misinterpreted. Order is important.
(r'&', r'&'),
(r'<', r'<'),
(r'>', r'>'),
(r'"', r'"'),
(r"'", r'''),
# Simple tags
(r'\[b\]', r'<b>'),
(r'\[/b\]', r'</b>'),
# Complex tags with parameters
(r'\[vimeo +(\d+) *\]', r'<iframe src="http://player.vimeo.com/video/\g<1>"'
r' width="400" height="225" frameborder="0"></iframe>'),
]
def process_markup(value):
for pattern, repl in _TAGS:
value = re.sub(pattern, repl, value)
return value
可能有更好的方法来编写这个功能,但你明白了。
答案 1 :(得分:0)
请勿在{{1}}中执行此操作。而是在模板中。但是你必须解析这个值,所以我建议你写一个简单的模板过滤器:
TextField
然后在模板中:
from django.template.defaultfilters import stringfilter
import re
@stringfilter
def textfieldtourl(value):
#parsing of your '[vimeo <id>]'
#return "http://player.vimeo.com/video/<id>"
<iframe src="{{ my_object.my_text_field|textfieldtourl }}" width="400" height="225" frameborder="0"></iframe>
是定义my_object
的对象,TextField
是TextField的名称,my_text_field
是您要过滤的名称定义用实际网址替换textfieldtourl
之类的代码。