Замена слов в текстовом поле в Django - PullRequest
0 голосов
/ 22 октября 2010

В django, в TextField, как заменить,

[vimeo 123456]

с

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

Спасибо.

Ответы [ 2 ]

1 голос
/ 22 октября 2010

Я не думаю, что это хорошая идея иметь HTML в TextField.Во-первых, это затруднит редактирование (вам придется писать код для перевода назад, что будет сложнее, чем пересылка);во-вторых, тратится много времени на хранение большого количества 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

Возможно, есть и лучшие способы написания этой функции, но вы поймете идею.

0 голосов
/ 22 октября 2010

Не делайте этого в вашем 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 - имя фильтра, который вы определите для замены кода, подобного [vimeo 1235] по фактическому URL.

Дополнительная информация о написании пользовательских шаблонов .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...