Django: пользовательский тег шаблона для преобразования ссылок внутри TextField и изменения текста гиперссылки

Сценарий таков: в некоторых шаблонах есть динамические тексты, которые будут содержать гиперссылки. Для этого у меня есть модель SiteDataKeyValue, в которую вводятся динамические тексты для разных частей шаблона. Вот эта модель:

class SiteDataKeyValue(models.Model):
    key = models.CharField(
        max_length=200, verbose_name="نام متن مورد نظر", unique=True
    )
    value = models.TextField(verbose_name="متن")

    def __str__(self):
        return self.key

Решением, которое я уже нашел, является тег шаблона Django urlize. Как указано в документации, этот тег преобразует тексты типа https://www.google.com в <a href="http://www.google.com" rel="nofollow">www.google.com</a>, что хорошо, но не то, чего я хотел бы добиться. Я хочу иметь возможность изменять текст гиперссылки, поэтому на выходе должно получиться что-то вроде: <a href="http://www.google.com" rel="nofollow">Click Here!</a>.

Я немного поискал, наткнулся на такие модули, как bleach, который является прекрасным модулем, но я не смог найти ответ, который я искал (я пролистал документацию и там ничего не было о тексте гиперссылки).

Также я где-то видел комментарий о том, что этого можно добиться, написав custom Django template tag, но хотя я пытался сделать это в документации custom template filters docs, я не понял, как этого добиться.

Я не прошу код, хотя был бы очень признателен, если бы вы предоставили инструкции по написанию этого пользовательского тега шаблона, или лучше, если бы вы могли указать мне на что-то подобное, что уже существует.

Во-первых, вы можете расширить тег urlize, как это сделано в ответе this

или вы можете изменить основной код, который вы можете найти в django.utils.html и переопределить его переменную url, чтобы изменить его.

Но я думаю, что лучший метод - это расширение тега urlize вот так:

{% text | urlize | change_a_text_filter:{{ dome_new_a_text }} %}

тогда вы можете отсканировать текст и использовать regex для поиска >sample-text</a> тогда вы можете изменить его на аргумент, который определяет в вашем теге

from django import template

register = template.Library()

@register.simple_tag
def change_a_text_filter(format_string, arg):
    # find the url that made in urlize with regex
    # change it with arg
    # return the result

Я шел совершенно неверным путем для решения этой проблемы. Я пытался urlize ссылку из TextField, но не учел тот факт, что мне нужно было только внедрить html код как <a href="https://www.link.com">Visit link.com!</a> в TextField, а затем использовать тег шаблона safe для рендеринга html напрямую, как показано ниже:

{{ text.value|safe }}

Так что в этом решении нет необходимости urlize, и, конечно, нет необходимости расширять этот тег тоже.

Вернуться на верх