Делать все слова, начинающиеся с "@" и "#", кликабельными - PullRequest
1 голос
/ 09 мая 2019

Я создаю проект, который позволяет пользователям нажимать на слова, начинающиеся с «#» и «@», мне удалось получить тот, который работает для хэштега, но когда я пытаюсь реализовать оба варианта одновременно, возникает проблема

Я использовал операции с регулярными выражениями для возврата значения и mark_safe, потому что это html-тег

В шаблоне tag_files я сделал это

def create_hashtag_link(tag):
    url = "/hash/?hash={}".format(tag)
    # or: url = reverse("hashtag", args=(tag,))
    return '<a href="{}">#{}</a>'.format(url, tag)


@register.filter()
def hashtag_links(value):
    return mark_safe(
        re.sub(r"#(\w+)", lambda m: create_hashtag_link(m.group(1)),
               escape(value)))


def create_mention_link(mention):
    link = "/mention/?user={}".format(mention)
    return '<a href="{}">{}</a>'.format(link, mention)


@register.filter()
def mention_link(value):
    return mark_safe(
        re.sub(r"@(\w+)", lambda x: create_mention_link(x.group(0)),
               escape(value)))

В шаблоне я сделал это

{{ post.content|truncatewords:"19"|mention_link|hashtag_links }}

Это выводит это:

#testing things out <a href="/mention/?user=lol">lol</a>

хэштег работает, но "@" не

1 Ответ

1 голос
/ 09 мая 2019

#testing things out <a href="/mention/?user=lol">lol</a>

Разве это не правильно?Ссылка выглядит как желаемый результат?

Если только он не отображает вышеизложенное буквально



Попробуйте вместо этого

def create_hashtag_link(tag):
    url = "/hash/?hash={}".format(tag)
    # or: url = reverse("hashtag", args=(tag,))
    return '<a href="{}">#{}</a>'.format(url, tag)


@register.filter()
def hashtag_links(value):
    return mark_safe(
        re.sub(r"#(\w+)", lambda m: create_hashtag_link(m.group(1)),
               value))


def create_mention_link(mention):
    link = "/mention/?user={}".format(mention)
    return '<a href="{}">{}</a>'.format(link, mention)


@register.filter()
def mention_link(value):
    return mark_safe(
        re.sub(r"@(\w+)", lambda x: create_mention_link(x.group(0)),
               value))

В основном, escape делаетследующее ( source )

Возвращает данный текст с амперсандами, кавычками и угловыми скобками, закодированными для использования в HTML.

Я думаю, что однаждывы применяете один из фильтров, так как вы делаете escape(value), теперь вы избежали всего содержимого, кроме части, которую вы заменили.Когда вы применяете второй фильтр, этот процесс повторяется, вы заменяете некоторую часть, но нетронутый раздел теперь экранирован.Я подозреваю, что конечный результат (если вы сделали страницу источника) будет выглядеть следующим образом:

<a href="/hash/?hash=testing">#testing</a> things out &lt;a href=&quot;/mention/?user=@lol&quot;&gt;@lol&lt;/a&gt;

Таким образом, хэштег (потому что он был применен последним) в порядке, но ссылка не 'на самом деле рендеринг как HTML.

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