Python 在Django中替换文本字段中的单词

Python 在Django中替换文本字段中的单词,python,django,replace,Python,Django,Replace,在django,在TextField,我们如何替换 [vimeo 123456] 与 谢谢。不要在文本字段中这样做。而不是在模板中。但是,您必须解析该值,因此我建议您编写一个简单的模板过滤器: from django.template.defaultfilters import stringfilter import re @stringfilter def textfieldtourl(value): #parsing of your '[vimeo <id>]'

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

[vimeo 123456]



谢谢。

不要在
文本字段中这样做。而不是在模板中。但是,您必须解析该值,因此我建议您编写一个简单的模板过滤器:

from django.template.defaultfilters import stringfilter
import re

@stringfilter
def textfieldtourl(value):
    #parsing of your '[vimeo <id>]'
    #return "http://player.vimeo.com/video/<id>"
从django.template.defaultfilters导入stringfilter
进口稀土
@细滤器
def textfieldtourl(值):
#解析您的“[vimeo]”
#返回“http://player.vimeo.com/video/"
然后在模板中:

<iframe src="{{ my_object.my_text_field|textfieldtourl }}" width="400" height="225" frameborder="0"></iframe>

其中,
my\u object
是定义
TextField
的对象,
my\u text\u field
是文本字段的名称,
textfieldtourl
是将要定义的过滤器的名称,以实际url替换类似
[vimeo 1235]
的代码


.

我认为将HTML放在
文本字段中不是一个好主意。首先,这会让编辑变得很痛苦(你必须编写代码进行反向翻译,这比正向翻译更困难);第二,在数据库中存储大量HTML会浪费磁盘;最后,这将使以后修复bug变得更加困难(例如,如果Vimeo更改了URL格式)

我可以看到您有两个选择:

1.视图功能 在视图函数中执行此转换。您的视图函数将有一行,如:

context["commentText"] = process_markup(thePost.commentText)
然后,在模板文件中,您需要将该字段标记为
safe
,因为您已经对其进行了筛选:

{{ commentText|safe }}
2.自定义过滤器 在自定义筛选器标记中执行此转换,如
django.contrib.markup
中的
restructedText
筛选器。这是sebpiq推荐的,可能是更好的选择

from django.template.defaultfilters import stringfilter
import re

@stringfilter
def mymarkup(value):
    return process_markup(value)
然后,在模板文件中,需要调用过滤器:

{{ commentText|mymarkup }}

在这两种情况下,您都需要编写
process\u标记(值)
,它看起来像:

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
重新导入
_标签=[
#首先,避免任何可能被误解的事情。秩序很重要。
(r"及",r"及"),,
(r'',r''),
(r’’,r’),
(r",r"及"39"),,
#简单标签
(r'\[b\]',r'),
(r'\[/b\]',r'),
#带参数的复杂标记
(r'\[vimeo+(\d+*\]',r'),
]
def过程标记(值):
对于模式,repl in_标记:
value=re.sub(模式、复制、值)
返回值

可能有更好的方法来编写此函数,但你明白了。

想想博客系统,当我添加内容时,也许我会想使用[vimeo 123456]组合。所以,我认为我们应该用模板来解决这个问题。因为也许我不会用这个。你认为呢?“当我添加内容时,也许我会想使用[vimeo 123456]组合”你的意思是,实际添加内容的用户会在某个表单字段中写“[vimeo 123456]”???如果不是你的意思,我想我没听懂……对不起,我的英语水平很低。在我的博客系统中,我会使用这些代码,可能在第一行,或者在内容的末尾,或者在内容的某个地方。所以这应该发生在textfield中。谢谢你的帮助。你的英语水平很好,只是你的解释不是很清楚!“这个代码”什么代码(你是说…)?“内容”哪些内容(你是指你的html页面)?无论如何,你不应该在模型中存储html,所以无论你想做什么,我建议你在文本字段中存储“[vimeo 123456]”,并在模板中将其格式化为url(就像我在回答中告诉你的那样)。我也是django的新手。如果你明白我的意思,好的,我晚上会试试你的建议。我将在templatetags文件夹中编写您的第一个代码?第二个代码,在模板文件中。如果我写入[vimeo 123456],它将替换为iframe代码。再次感谢你。
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