Python 在Django中替换文本字段中的单词
在django,在TextField,我们如何替换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>]'
[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'&'),
(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
重新导入
_标签=[
#首先,避免任何可能被误解的事情。秩序很重要。
(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'&'),
(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