[django]从 urlize 过滤器中排除 YouTube 链接,并在 Django 模板中处理 iframe 标签

· 收录于 2024-01-06 17:03:08 · source URL

问题详情

我在 Django 模板中遇到了一个问题,我想从 django urlize 过滤器中排除 YouTube 链接,并确保正确显示剩余内容,包括嵌入了 iframe 标签的 YouTube 视频。这是我的模板和视图的简化版本

这是模板 <div class=comment-body>{{comment.body|safe|linebreaksbr|urlize}}</div>

以下是我将 YouTube 链接转换为 iframe 的方法:

    yt_link = re.compile(r'(https?://)?(www\.)?((youtu\.be/)|(youtube\.com/watch/?\?v=))([A-Za-z0-9-_]+)', re.I)
    yt_embed = '<iframe width="460" height="215" src="https://www.youtube.com/embed/{0}" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>'

def convert_ytframe(text):
  return yt_link.sub(lambda match: yt_embed.format(match.groups()[5]), text)
  1. 如何修改模板以从 urlize 过滤器中排除 YouTube 链接
  2. 如何确保其余内容(包括 YouTube 视频)正确显示,并且 iframe 标记不受 urlize 过滤器的影响

最佳回答

修改convert_ytframe功能以处理 YouTube 链接的转换并跟踪它们

 import re

yt_link = re.compile(r'(https?://)?(www\.)?((youtu\.be/)|(youtube\.com/watch/?\?v=))([A-Za-z0-9-_]+)', re.I)
yt_embed = '<iframe width="460" height="215" src="https://www.youtube.com/embed/{0}" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>'

def convert_ytframe(text):
    def replace(match):
        youtube_id = match.groups()[5]
        return yt_embed.format(youtube_id)

    return yt_link.sub(replace, text)

更新您的 Django 模板以仅将 urlize 过滤器应用于非 YouTube 内容。

在 Django 视图中单独处理 YouTube 视频。 在 Django 视图中呈现内容时,可以将 YouTube 占位符替换为实际的 YouTube iframe 嵌入代码