[英]Replacing Words in TextField In Django
在Django的TextField中,如何替換
[vimeo 123456]
與
<iframe src="http://player.vimeo.com/video/123456" width="400" height="225" frameborder="0"></iframe>
謝謝。
我認為將HTML放在TextField
不是一個好主意。 首先,這會使編輯變得很痛苦(您必須編寫代碼以將其翻譯回去,這比前進要困難得多); 其次,在數據庫中存儲大量HTML會浪費磁盤。 最后,這將使以后更難修正錯誤(例如,如果Vimeo更改了其URL格式)。
您可以看到兩個選項:
在您的視圖函數中執行此翻譯。 您的視圖函數將具有以下一行:
context["commentText"] = process_markup(thePost.commentText)
然后,在模板文件中,由於已經過濾了該字段,因此需要將其標記為safe
字段:
{{ commentText|safe }}
在自定義過濾器標簽中進行此翻譯,例如django.contrib.markup
的restructuredtext
過濾器。 這是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
可能有更好的方法編寫此函數,但是您明白了。
不要在您的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
的對象, my_text_field
是TextField的名稱, textfieldtourl
是要定義的過濾器的名稱,該過濾器將用實際URL替換[vimeo 1235]
類的代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.