簡體   English   中英

在Django中替換TextField中的單詞

[英]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格式)。

您可以看到兩個選項:

1.查看功能

在您的視圖函數中執行此翻譯。 您的視圖函數將具有以下一行:

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

然后,在模板文件中,由於已經過濾了該字段,因此需要將其標記為safe字段:

{{ commentText|safe }}

2.自定義過濾器

在自定義過濾器標簽中進行此翻譯,例如django.contrib.markuprestructuredtext過濾器。 這是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

可能有更好的方法編寫此函數,但是您明白了。

不要在您的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM