在Django中替换TextField中的单词

时间:2010-10-22 08:50:16

标签: python django replace

在django中,在TextField中,我们如何替换,

[vimeo 123456]

<iframe src="http://player.vimeo.com/video/123456" width="400" height="225" frameborder="0"></iframe>

谢谢。

2 个答案:

答案 0 :(得分:1)

我不认为在TextField中使用HTML是个好主意。首先,它会使编辑成为一种痛苦(你必须编写代码来翻译,这将比前进更难);第二,它会浪费磁盘在数据库中存储大量的HTML;最后,它会使以后修复错误变得更加困难(例如,如果Vimeo更改了它们的URL格式)。

我可以看到两个选项:

1。查看功能

在您的视图功能中执行此转换。您的视图函数将具有如下行:

context["commentText"] = process_markup(thePost.commentText)

然后,在您的模板文件中,您需要将该字段标记为safe,因为您已经过滤了它:

{{ commentText|safe }}

2。自定义过滤器

在自定义过滤器标记中执行此转换,例如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'&amp;'),
    (r'<', r'&lt;'),
    (r'>', r'&gt;'),
    (r'"', r'&quot;'),
    (r"'", r'&#39;'),

    # 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之类的代码。

More infos on writing custom template fiters