Django - 替换UrlField的部分内容

5

我可以加载单个YouTube视频的URL。但现在的问题是如何加载YouTube的播放列表视频。所以我的问题是,我该如何替换两个相同模式,但都具有不同的URL替换?

例如:

实际URL:

<iframe width="400" height="327" src="http://www.youtube.com/embed/1UiICgvrsFI&amp;list=PLvAOICvbvsbnc5dLG0YR9Mq_tFfzAhQSp&amp;index=1" allowfullscreen="true"></iframe>

将模式替换为以下内容:

<iframe width="560" height="315" src="//www.youtube.com/embed/1UiICgvrsFI?list=PLvAOICvbvsbnc5dLG0YR9Mq_tFfzAhQSp" allowfullscreen></iframe>

这里第一个&amp;变成了?,第二个&amp;及其后面的内容,即&amp;index=1被剥离。

这是models.py文件:

class Video(models.Model):
    title = models.CharField(max_length=100)
    video_url = models.URLField(max_length=100)

    def save(self, *args, **kwargs):
        new_url = (self.video_url.replace("watch?v=","v/"))
        super(Video, self).save(*args, **kwargs)
        if new_url:
            self.video_url = new_url

编辑:

def save(self, *args, **kwargs):
        new_url = re.sub('watch\?v=','embed/',self.video_url)
        new_url = re.sub(r'^(http:\/\/)([\w\W]+)\&amp;list=([\w\W]+)(\&amp;index=[\d]+)$', r'//\2?list=\3', new_url)
        if new_url:
            self.video_url = new_url
            super(Video, self).save(*args, **kwargs)
2个回答

3

首先,看起来你的URL被编码了。请检查您的模板中是否有|urlencode过滤器 (https://docs.djangoproject.com/en/dev/ref/templates/builtins/#urlencode)。

要将视频 URL 更改为播放列表 URL,您需要使用正则表达式。您可以创建一个方法来将您的视频 URL 转换为播放列表 URL:

import re
...
def playlist_url(self):
    """
    Generates a playlist URL
    """
    new_url = re.sub(r'^(http:\/\/)([\w\W]+)&list=([\w\W]+)(\&index=[\d]+)$', r'//\2?list=\3', self.video_url)
    return new_url
...

谢谢您的答复。我尝试了一下,但 URL 中仍然有一个 &。您能否请用正则表达式来展示一下如何做到呢?还请注意,index=1 可能会有所变化。再次感谢。 - Robin
它在控制台中可以运行,但似乎不能在我的项目中工作... 您能否请看一下编辑,我已经添加了您的片段。 - Robin
搞定了!非常感谢你! - Robin

1
您可以使用HTMLParser.unescape函数来取消转义URL:
>>> import HTMLParser
>>> h = HTMLParser.HTMLParser()
h.unescape("http://www.youtube.com/embed/1UiICgvrsFI&amp;list=PLvAOICvbvsbnc5dLG0YR9Mq_tFfzAhQSp&amp;index=1")
'http://www.youtube.com/embed/1UiICgvrsFI&list=PLvAOICvbvsbnc5dLG0YR9Mq_tFfzAhQSp&index=1'

感谢您的回答。请注意,URL 可能会根据用户上传而有所不同。 - Robin
@Robin 你的意思是什么? - ndpu
抱歉,我的错。但我也想删除 &&index=... - Robin
@Robin 使用 urlstring.replace('&index=1', '') 或正则表达式的 sub 函数。 - ndpu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接