检测Django CharField中的URL和#标签并添加样式



现在,我的模板中有一个类似<p class="...">{{ post.content }}</p>的段落,如果这篇文章的内容包含链接或#hashtag,它将与文章的其余部分一起呈现为普通文本。如何自定义?例如,更改文本颜色并在其周围添加标签?

正如我在评论中所说,您可以使用自定义标签过滤器来包装您的内容,并使用正则表达式来生成链接和标签

创建您的标签文件,并根据需要命名:

tag_filter_name.py

如果你不熟悉自定义标签过滤器的创建,你可以在官方文档中了解更多信息

from django import template
import re
register = template.Library()
def generate_link(link):
return '<a class="link" href="{}">{}</a>'.format(link, link)
def generate_hashtag_link(tag):
# Free to configuree the URL the way adapted your project
url = "/tags/{}/".format(tag)
return '<a class="hashtag" href="{}">#{}</a>'.format(url, tag)

然后,你创建了一个函数,它将被用作标签过滤器

@register.filter
def render_content(obj):
text = re.sub(r"#(w+)", lambda m: generate_hashtag_link(m.group(1)),obj)
return re.sub(r"(?P<url>https?://[^s]+)", lambda m: generate_link(m.group(1)),text)

如果您希望Django将其标记为安全内容,您可以执行以下操作:

from django.utils.safestring import mark_safe # import function
''' function codes here '''
returnmark_safe(re.sub(r"(?Phttps?://[^s]+)", 
lambda m: generate_link(m.group(1)),text))

最后,要在模板中使用它,不要忘记加载

{% load tag_filter_name %}
{{ post.content|render_content}}

最佳方式:自定义标签过滤器这里是文档URLhttps://docs.djangoproject.com/en/2.2/ref/templates/builtins/

好方法:如果你知道JS创建一个函数来处理前端上的格式化

在HTML中:onload="myfunction("{{post.content}}"(">

在JS中,对包含#的字符串进行排序,将其包装在span或其他元素中,并将其样式去掉。然后用新格式化的部分替换内部HTML。这将节省服务器上的渲染时间,也使您不必在视图中循环浏览帖子列表

好的方式:不是首选,但如果你讨厌js,只想在python中工作(可以理解(。你需要循环浏览帖子列表,将帖子中的项目分离出来,用内联风格按照你喜欢的方式格式化它们。然后将它们添加到一个新对象中,并将其附加到新帖子列表的末尾,然后将其传递到上下文中。这真的很痛苦,如果你能帮上忙的话,请不要这样做。

标签过滤器很有优势,但如果它们不适用于您的用例,我强烈建议使用香草JS

最新更新